使用SevenZipSharp解压内存流失败:流无效或无对应签名
解决SevenZipSharp内存流压缩后解压失败的问题
我帮你分析下问题所在,大概率是压缩后内存流的位置没重置导致保存的归档文件不完整,加上可能的配置遗漏,才让解压时识别不了归档签名。
问题根源
你在调用CompressFiles把数据写入内存流后,直接执行memStream.CopyTo(file)——这时候内存流的读写指针已经停在流的末尾了,复制到文件的其实是空内容(或者不完整的归档数据),自然会让解压时提示找不到有效签名。另外,显式指定归档格式也能避免默认配置带来的兼容性问题。
修复后的压缩代码
SevenZipCompressor compress = new SevenZip.SevenZipCompressor(); compress.CompressionLevel = CompressionLevel.Normal; compress.CompressionMethod = CompressionMethod.Lzma; // 显式指定归档格式为7z,避免默认值带来的识别问题 compress.ArchiveFormat = OutArchiveFormat.SevenZip; using (MemoryStream memStream = new MemoryStream()) { compress.CompressFiles(memStream, @"d:\Temp1\MyFile.bmp"); // 关键:把内存流指针重置到起始位置,这样才能完整复制所有压缩数据 memStream.Seek(0, SeekOrigin.Begin); using (FileStream file = new FileStream(@"d:\arch.7z", FileMode.Create, System.IO.FileAccess.Write)) { memStream.CopyTo(file); } }
正确的解压代码
解压时也要确保流的位置正确,同时用SevenZipExtractor的标准流程来处理:
using (FileStream file = new FileStream(@"d:\arch.7z", FileMode.Open, System.IO.FileAccess.Read)) { // 确保文件流从起始位置开始读取 file.Seek(0, SeekOrigin.Begin); using (SevenZipExtractor extractor = new SevenZipExtractor(file)) { // 可选:先验证归档是否有效 if (!extractor.Check()) { Console.WriteLine("归档文件无效或损坏"); return; } // 解压到指定目录,比如d:\Temp2 extractor.ExtractArchive(@"d:\Temp2"); } }
额外注意事项
- 确认你部署了匹配版本的
7z.dll(32位/64位要和你的项目一致),缺失或不匹配的库也会导致归档识别失败。 - 如果是直接从内存流解压(不保存到文件),同样要确保解压前把内存流的指针重置到起始位置。
内容的提问来源于stack exchange,提问作者AbbasFaisal
相关产品推荐
相关产品推荐

