Можно ли активировать несколько записей zip-файлов с помощью класса ZipOutputStream? - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь использовать библиотеку с открытым исходным кодом 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 голосов
/ 06 мая 2019

У меня похожая проблема, и я решил эту проблему с помощью 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);
}
0 голосов
/ 06 мая 2019

Кажется, что ожидаемое поведение в соответствии с документами

Если вы не вызываете Write () между двумя вызовами PutNextEntry (), первая запись вставляется в zip-файл как файл нулевого размера . Это может быть то, что вы хотите.

Так что мне кажется, что через текущий API невозможно сделать то, что вы хотите.

Кроме того, поскольку zip-файл представляет собой непрерывную последовательность записей zip, вероятно, физически невозможно создавать записи параллельно, так как вам необходимо знать размер каждой записи перед началом новой записи.

Возможно, вы могли бы просто создать отдельные архивы и затем объединить их (если я не ошибаюсь, для этого был простой API)

...