Я уже два дня ломаю голову над этим. Мы используем 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?
Спасибо