Поток недействителен или соответствующая подпись не найдена

Я пытаюсь использовать SevenZipSharp для сжатия и распаковки потока памяти. Сжатие работает нормально, а распаковка нет. Я думаю, что SevenZipSharp не может определить тип архива из потока.

SevenZipCompressor compress = new SevenZip.SevenZipCompressor();
compress.CompressionLevel = CompressionLevel.Normal;
compress.CompressionMethod = CompressionMethod.Lzma

using (MemoryStream memStream = new MemoryStream())
{
    compress.CompressFiles(memStream, @"d:\Temp1\MyFile.bmp");

    using (FileStream file = new FileStream(@"d:\arch.7z", FileMode.Create, System.IO.FileAccess.Write))
    {
        memStream.CopyTo(file);
    }
}

//works till here, file is created
Console.Read();

using (FileStream file = new FileStream(@"d:\arch.7z", FileMode.Open, System.IO.FileAccess.Read))
{
    using (MemoryStream memStream = new MemoryStream())
    {
        file.CopyTo(memStream);

        //throws exception here on this line
        using (var extractor = new SevenZipExtractor(memStream))
        {
            extractor.ExtractFiles(@"d:\x", 0);
        }
    }
}

person AbbasFaisal    schedule 01.02.2018    source источник


Ответы (1)


Попробуйте посмотреть, можно ли загрузить ваш выходной файл с помощью клиента 7Zip. Я предполагаю, что это не удастся.

Проблема заключается в записи в memorystream. Скажем, вы записываете в поток 100 байт, он будет на позиции 100. При использовании CopyTo поток будет скопирован с текущей позиции, а не с начала потока.

Таким образом, вам придется сбросить позицию на 0 после чтения/записи, чтобы следующий читатель мог прочитать все данные. Например, при создании файла 7Zip:

using (MemoryStream memStream = new MemoryStream())
{
    // Position starts at 0
    compress.CompressFiles(memStream, @"d:\Temp1\MyFile.bmp");
    // Position is now N

    memStream.Position = 0; // <-- Reset the position to 0.

    using (FileStream file = new FileStream(@"d:\arch.7z", FileMode.Create, System.IO.FileAccess.Write))
    {
        // Will copy all data in the stream from current position till the end of the stream.
        memStream.CopyTo(file);
    }
}
person RMH    schedule 01.02.2018
comment
Работал как шарм. Хотя глупо с моей стороны не проверить, может ли созданный архив быть извлечен приложением 7zip. Спасибо. - person AbbasFaisal; 01.02.2018