我正在尝试使用DotNetZip开源库来创建大型zip文件。
我需要能够将数据表的数据行内容(请参见下面的代码)的一部分写入每个流写入器。我的其他限制是由于内容很大(每个条目几个千兆字节),所以无法在内存中执行此操作。
我的问题是,尽管分别写入每个流,但输出都只写入最后一个条目。第一个条目包含空白。有人对如何解决此问题有任何想法吗?
static void Main(string fileName)
{
var dt = CreateDataTable();
var streamWriters = new StreamWriter[2];
using (var zipOutputStream = new ZipOutputStream(File.Create(fileName)))
{
for (var i = 0; i < 2; i++)
{
var entryName = "file" + i + ".txt";
zipOutputStream.PutNextEntry(entryName);
streamWriters[i] = new StreamWriter(zipOutputStream, Encoding.UTF8);
}
WriteContents(streamWriters[0], streamWriters[1], dt);
zipOutputStream.Close();
}
}
private DataTable CreateDataTable()
{
var dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] { new DataColumn("col1"), new DataColumn("col2"), new DataColumn("col3"), new DataColumn("col4") });
for (int i = 0; i < 100000; i++)
{
var row = dt.NewRow();
for (int j = 0; j < 4; j++)
{
row[j] = j * 1;
}
dt.Rows.Add(row);
}
return dt;
}
private void WriteContents(StreamWriter writer1, StreamWriter writer2, DataTable dt)
{
foreach (DataRow dataRow in dt.Rows)
{
writer1.WriteLine(dataRow[0] + ", " + dataRow[1]);
writer2.WriteLine(dataRow[2] + ", " + dataRow[3]);
}
}
预期结果:
file0.txt和file1.txt都需要编写。
实际结果:
仅将file1.txt文件写入所有内容。 file0.txt为空白。
答案 0 :(得分:0)
根据docs
,这似乎是预期的行为如果在两次调用PutNextEntry()之间没有调用Write(),则第一个条目将作为零尺寸文件插入到zip文件中。这可能就是您想要的。
对我来说,似乎无法通过当前API来完成您想要的事情。
另外,由于zip file是zip条目的连续序列,因此实际上不可能并行创建条目,因为在开始新的条目之前您必须知道每个条目的大小。
也许您可以创建单独的存档,然后将它们合并(如果我没记错的话,有一个简单的API可以做到这一点)
答案 1 :(得分:0)
我有一个类似的问题,我用StreamWriter和FastZip(免费库)解决了这个问题
//For maninpulate a big data string
using (StreamWriter NAME = new StreamWriter(pathOriginal, false, Encoding.GetEncoding("ISO-8859-1")))
{
foreach (var item in anyList)
{
var lines = new StringBuilder();
lines.Append(lines.AnyAttribute);
NAME.Write(lines.ToString());
}
NAME.Close();
}
//To compact
try
{
FastZip fz = new FastZip();
fz.CreateZip(pathDestiny, pathOriginal, true, fileName);
}
catch (Exception ex)
{
LoggerHelper.ErroLog(ex);
}