Добавление потоков с SevenSharpZip - PullRequest
1 голос
/ 30 июня 2011

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

Подведем итог:

  1. Добавление файлов вместо потоков, ОК
  2. CompressStream в режиме = Создать, ОК
  3. После этого CompressStream в режиме = Добавить не удается.

У кого-нибудь есть рабочий код добавления нескольких потоков в файл .7z, или это может быть ошибка, которую я должен опубликовать на форуме SevenZipSharp?

Спасибо

Ответы [ 2 ]

4 голосов
/ 02 июля 2011

Будет ли работать 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);
    }
}

Я подозреваю, что вы пытаетесь сделать это, создав несколько последовательных архивов последовательно в одном потоке, а не добавляя файлы в один архив. Хотя это также может быть связано с отсутствием управления ресурсами (вы должны обернуть время жизни этих потоков в использование блоков или иным образом утилизировать их).

0 голосов
/ 30 июня 2011

Поток - это метод получения предметов из одного места в другое;это тип поведения объекта, который перемещается из состояния в состояние.Это означает, что это не конечная точка или тип состояния объекта.Вы не можете добавить к поведению, вы добавляете к состоянию.Таким образом, это не ошибка.

Это, вероятно, не полезно.Посмотрите, существует ли какой-либо тип расположения файла в памяти (т. Е. Весь файл в памяти), а затем используйте его в качестве отправной точки для добавления.Я не уверен, что это так, поскольку сжатые файлы могут стать огромными.

...