SharpCompress解压含波浪号(~)文件报错:尝试写入目标目录外
解决SharpCompress解压含波浪号(~)文件的路径报错问题
这个报错是因为SharpCompress的路径安全校验会把带~的文件名误判为Windows短路径(比如C:\PROGRA~1这种格式),进而认为文件会被写到目标目录之外。既然手动替换~为_能解决,我们直接在代码里自动处理就行,不用改动原始压缩文件。
直接修改你的代码,替换掉WriteEntryToDirectory的调用逻辑,改成手动处理文件流和文件名:
public static void extractcompressedfiles_mk2(string Compressedfilepath, string extractPath) { System.IO.Directory.CreateDirectory(extractPath); try { using (Stream stream = File.OpenRead(Compressedfilepath)) using (var reader = ReaderFactory.Open(stream)) { while (reader.MoveToNextEntry()) { if (!reader.Entry.IsDirectory) { // 替换Entry路径中的波浪号为下划线 string modifiedEntryKey = reader.Entry.Key.Replace('~', '_'); Console.WriteLine(modifiedEntryKey); // 构建目标文件的完整路径 string targetFilePath = Path.Combine(extractPath, modifiedEntryKey); // 确保目标文件所在的父目录存在 string targetDir = Path.GetDirectoryName(targetFilePath); if (!Directory.Exists(targetDir)) { Directory.CreateDirectory(targetDir); } // 手动读取压缩包内的文件流并写入目标文件 using (var entryStream = reader.Entry.OpenEntryStream()) using (var fileStream = File.OpenWrite(targetFilePath)) { entryStream.CopyTo(fileStream); } } } } } catch (Exception e) { Common.Globals.intExceptionErrors++; Logging.system.Error($"Extract Source Compressed Files: {e.Message}"); } }
关键改动说明:
- 先把
reader.Entry.Key里的~替换成_,避免触发SharpCompress的短路径误判逻辑 - 手动构建目标文件路径,确保所有文件都严格落在
extractPath目录范围内 - 用
OpenEntryStream()读取压缩内容,再写入到修改后的目标文件,绕开SharpCompress自带的路径校验
这样处理后,代码会自动处理含~的条目,不用再手动修改压缩文件,同时保持解压逻辑和原有需求一致。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

