2

我正在尝试使用 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);
        }
    }
}
4

1 回答 1

3

尝试查看您的输出文件是否可以使用 7Zip 客户端加载。我猜它会失败。

问题在于写入内存流。假设您向流中写入 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);
    }
}
于 2018-02-01T13:16:11.940 回答