Добавление потоков с помощью SevenSharpZip
Я стучу головой об этом в течение 2 дней. Мы используем 7ZipSharp для создания файлов.7z из нескольких исходных файлов (фактически входящих сообщений).
Чтобы оптимизировать приложение, я хочу избежать доступа к жесткому диску, поэтому я переключился на семейство функций CompressStreams.
Код, использующий имена файлов вместо Streams, работает отлично. При переключении на потоки я получаю "KeyNotFoundException", только когда CompressionMode = Append.
Мой тестовый код:
for (var i = 0; i < numFiles; i++)
{
//if(i > 0)
// compressor.CompressionMode = CompressionMode.Append;
Console.WriteLine("Adding copy num " + (i + 1) + " to the archive");
SevenZipUtil.AddStream(File.OpenRead(sampleFile), "email-" + i + ".eml", outFile);
}
Код вспомогательного метода:
public static void AddStream(Stream inStream, string fileName, string destinationFile)
{
SevenZipCompressor comp = new SevenZipCompressor();
comp.ArchiveFormat = OutArchiveFormat.SevenZip;
comp.CompressionLevel = CompressionLevel.Ultra;
if(File.Exists(destinationFile))
{
comp.CompressionMode = CompressionMode.Append;
}
FileStream outStream = File.OpenWrite(destinationFile);
comp.DefaultItemName = fileName;
comp.CompressStream(inStream, outStream);
outStream.Flush();
outStream.Close();
}
Источником ошибки является файл LibraryManager.cs, метод InArchive, строка 428.
if (_inArchives[user][format] == null
Подвести итоги:
- Добавление файлов вместо потоков, ОК
- CompressStream в режиме = Создать, ОК
- После этого CompressStream в режиме = Добавить не удается.
Есть ли у кого-нибудь рабочий код для добавления нескольких потоков в файл.7z, или это может быть ошибка, которую я должен опубликовать на форуме SevenZipSharp?
Спасибо,
2 ответа
Будет ли CompressStreamDictionary работать для вас?
void TestZipping()
{
SevenZipCompressor compressor = new SevenZipCompressor
{
ArchiveFormat = OutArchiveFormat.SevenZip,
CompressionLevel = CompressionLevel.Ultra,
};
using (Stream output = File.Open("test.7z", FileMode.CreateNew))
using (Stream file1 = File.Open("test1.txt", FileMode.Open))
using (Stream file2 = File.Open("test2.txt", FileMode.Open))
{
compressor.CompressStreamDictionary(new Dictionary<string, Stream> {{ "test1.txt", file1 }, { "test2.txt", file2 }}, output);
}
}
Я подозреваю, что вы пытаетесь сделать это, создав несколько последовательных архивов последовательно в одном потоке, а не добавляя файлы в один архив. Хотя это также может быть связано с отсутствием управления ресурсами (вы должны обернуть время жизни этих потоков в использование блоков или иным образом утилизировать их должным образом).
Поток - это метод получения предметов из одного места в другое; это тип поведения объекта, который перемещается из состояния в состояние. Это означает, что это не конечная точка или тип состояния объекта. Вы не можете добавить к поведению, вы добавляете к состоянию. Так что это не ошибка.
Это, вероятно, не полезно. Посмотрите, существует ли какой-либо тип расположения файла в памяти (т. Е. Весь файл в памяти), а затем используйте его в качестве отправной точки для добавления. Я не уверен, что это так, поскольку сжатые файлы могут стать огромными.