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