流无效或未找到对应的签名
The stream is invalid or no corresponding signature was found
我正在尝试使用 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);
}
}
}
尝试查看您的输出文件是否可以使用 7Zip 客户端加载。我猜它会失败。
问题出在写入内存流上。比如说,你向流写入 100 个字节,它将位于位置 100。当你使用 CopyTo 时,流将从 current 位置复制,而不是流的开头。
因此您必须在 reading/writing 之后将位置重置为 0,以允许下一个 reader 读取所有数据。例如在创建 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);
}
}
我正在尝试使用 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);
}
}
}
尝试查看您的输出文件是否可以使用 7Zip 客户端加载。我猜它会失败。
问题出在写入内存流上。比如说,你向流写入 100 个字节,它将位于位置 100。当你使用 CopyTo 时,流将从 current 位置复制,而不是流的开头。
因此您必须在 reading/writing 之后将位置重置为 0,以允许下一个 reader 读取所有数据。例如在创建 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);
}
}