【发布时间】:2017-03-06 15:38:14
【问题描述】:
我有一个用 C# 编写的程序,它应该每 n 条记录(如 500 条)保存一个 zip 文件。
我的想法是使用 mod 运算符 (%) 并且操作的结果为零,然后写入文件。哪个好,但是:如果我有 520 条记录怎么办?我应该在第一个 zip 中写入 500 个文件,然后在第二个 zip 中写入 20 个文件。
代码如下:
using (ZipFile zip = new ZipFile())
{
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.Level8;
zip.CompressionMethod = CompressionMethod.Deflate;
int indexrow = 0;
foreach(DataRow row in in_dt.Rows)
{
zip.AddFile(row["Path"].ToString(),"prova123");
if(indexrow % 500 == 0)
{
using (var myZipFile = new FileStream("c:\\tmp\\partial_"+indexrow.ToString()+".zip", FileMode.Create))
{
zip.Save(myZipFile);
}
indexrow = indexrow++;
}
}
}
}
in_dt 是一个数据表,其中包含文件系统上的所有文件路径。
zip 对象是基于 dotnetzip 库的对象。
【问题讨论】:
-
首先这不起作用,因为您的 indexrow 只会在 0 和 1 之间反弹,因为您在循环中声明它。其次,你要做的是,在循环结束时(在它之外),如果 indexrow % 500 != 0,那么你知道你有一些挂起的文件,所以保存 zip 文件。另外,我以前没有使用过 dotnetzip,但是我假设您需要在每次保存后声明一个新的
ZipFile,因为它怎么知道删除您已经调用的所有文件AddFile? -
我不确定我是否理解,但如果我是对的,你想要的是在
indexrow = indexrow++;之后检查类似if (in_dt.Rows.Count - indexrow<500) { //create the second zip with the rest of files};的内容 -
@Pikoh 这根本行不通。如果我有 500 行,你的 if 语句将返回 true 499 次。
-
当然。如果我把他说对了,这就是 op 想要的
-
@Pikoh 如果他有 520 个文件,他想创建 2 个 zip 文件。您将创建 500 个 zip 文件。我不认为这是他想要的。
标签: c#