使用SharpCompress解压7-Zip文件时频繁触发“File does not have a stream”错误的代码修改咨询
使用SharpCompress解压7-Zip文件时频繁触发“File does not have a stream”错误的代码修改咨询
Hey,我看你在用SharpCompress解压7-Zip文件时碰到了这个头疼的“File does not have a stream”错误,而且还只解压出单个文件就挂了——这个问题我之前也帮不少开发者排查过,结合你提到的SharpCompress的已知问题,给你几个具体的代码调整方向,你可以一步步试:
1. 给有问题的归档条目加异常捕获/过滤
这个错误大多是因为归档里存在无效条目(比如空占位项、损坏的文件条目),直接处理会导致整个流程崩溃。你可以在处理每个条目时加个异常捕获,跳过出问题的条目,不让整个解压任务终止:
foreach (var entry in archive.Entries) { if (!entry.IsDirectory) { try { entry.WriteToDirectory(fichierVide, new ExtractionOptions() { ExtractFullPath = true, Overwrite = true }); } catch (InvalidOperationException ex) when (ex.Message.Contains("File does not have a stream")) { // 这里可以加日志记录,方便后续排查哪个条目出了问题 // 比如 log.Warn($"跳过无效归档条目: {entry.Key}, 错误信息: {ex.Message}"); continue; // 跳过这个条目,继续处理其他文件 } } }
另外,也可以在处理前先判断条目是否能正常获取流,提前过滤掉无效条目:
if (!entry.IsDirectory) { try { // 尝试打开流,判断条目是否有效 using (var stream = entry.OpenEntryStream()) { if (stream != null) { entry.WriteToDirectory(fichierVide, new ExtractionOptions() { ExtractFullPath = true, Overwrite = true }); } } } catch (Exception ex) { // 日志记录+跳过 continue; } }
2. 先确认7-Zip文件已经完全写入磁盘
很多时候这个错误是因为文件还在被写入(比如上传还没完成)就触发了解压任务,导致读取了不完整的归档文件。你可以在解压前加个小校验,确保文件已经完全写完、没有被其他进程占用:
foreach (var fichierZip in fichiersZip) { bool isFileAvailable = false; int retryTimes = 3; // 最多重试3次 while (retryTimes > 0 && !isFileAvailable) { try { // 尝试以排他方式打开文件,确认没有被其他进程占用 using (var fs = new FileStream(fichierZip, FileMode.Open, FileAccess.Read, FileShare.None)) { isFileAvailable = true; } } catch (IOException) { retryTimes--; System.Threading.Thread.Sleep(1000); // 等待1秒再重试 } } if (!isFileAvailable) { // 记录日志,跳过这个文件,等下次任务再处理 // log.Warn($"文件 {fichierZip} 暂时无法访问,跳过本次解压"); continue; } // 接下来执行你的解压逻辑... var fichierVide = string.Concat(dossierDepot, "\\", Path.GetFileNameWithoutExtension(fichierZip)); Directory.CreateDirectory(fichierVide); using (var archive = ArchiveFactory.Open(fichierZip)) { // ... 条目处理逻辑 } }
3. 换一种方式打开归档文件
你当前用ArchiveFactory.Open(fichierZip)直接传入文件路径,有时候会因为内部流处理的问题触发错误。可以试试手动用FileStream打开文件再传入:
using (var fs = File.OpenRead(fichierZip)) using (var archive = ArchiveFactory.Open(fs)) { foreach (var entry in archive.Entries) { // 条目处理逻辑和之前一样 } }
4. 先升级SharpCompress到最新稳定版
你提到的这个部分解压的问题,在SharpCompress的后续版本里已经修复了不少已知的流处理bug。先检查下你当前用的版本,如果不是最新的,先升级到最新稳定版,很多时候就能直接解决问题。
总结
建议你按照这个顺序尝试:先升级SharpCompress版本,然后给条目处理加异常捕获,最后加上文件可用性校验。这样既能保证大部分正常文件能完整解压,又不会因为个别无效条目或不完整文件导致整个任务崩溃。
内容来源于stack exchange
相关产品推荐
相关产品推荐

