使用ZipOutputStream类可以激活多个zip文件条目吗?

时间:2019-05-06 19:34:28

标签: c# dotnetzip

我正在尝试使用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为空白。

2 个答案:

答案 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);
}