使用SharpZipLib时TarArchive解压内容出现挂起问题
问题排查与修复方案
针对你使用SharpZipLib创建tar归档后解压挂起的问题,结合代码分析,主要有几个核心问题及对应修复方式:
1. 路径转义字符错误
代码中路径里的\t是C#的制表符转义序列,并非路径分隔符,会导致实际文件路径异常(比如path_to_desktop\tartest.tar会被解析成带制表符的无效路径)。必须修正为双反斜杠或逐字字符串:
// 用逐字字符串避免转义问题 string tarFile = @"path_to_desktop\tartest.tar"; string inputFolder = @"path_to_desktop\testfolder"; string outputPath = @"path_to_desktop\tartest";
2. Tar归档未完成完整写入
虽然using块会自动释放资源,但SharpZipLib的TarArchive在输出时,建议手动调用Finish()确保所有归档数据写入文件,避免归档结构不完整导致解压时挂起:
using (var archive = TarArchive.CreateOutputTarArchive(output, Encoding.UTF8)) { var trimLength = inputFolder.Length + 1; foreach (var fsEntry in Directory.GetFileSystemEntries(inputFolder, "*", SearchOption.AllDirectories)) { var entry = TarEntry.CreateEntryFromFile(fsEntry); // 处理目录项格式,确保以/结尾 entry.Name = Directory.Exists(fsEntry) ? fsEntry.Substring(trimLength) + "/" : fsEntry.Substring(trimLength); archive.WriteEntry(entry, false); } // 手动触发归档写入完成 archive.Finish(); }
3. 目录项格式不符合Tar规范
Tar规范要求目录项的名称必须以/结尾,否则解压时会被识别为文件,导致GetNextEntry()读取条目时出现异常挂起。上面的代码已添加目录判断和后缀处理。
修正后的完整代码
public void CreateTarAndExtract() { // 修正路径为逐字字符串,避免转义错误 string tarFile = @"path_to_desktop\tartest.tar"; string inputFolder = @"path_to_desktop\testfolder"; // 创建tar文件 using (var output = File.OpenWrite(tarFile)) { using (var archive = TarArchive.CreateOutputTarArchive(output, Encoding.UTF8)) { var trimLength = inputFolder.Length + 1; foreach (var fsEntry in Directory.GetFileSystemEntries(inputFolder, "*", SearchOption.AllDirectories)) { var entry = TarEntry.CreateEntryFromFile(fsEntry); // 处理目录项格式,符合Tar规范 entry.Name = Directory.Exists(fsEntry) ? fsEntry.Substring(trimLength) + "/" : fsEntry.Substring(trimLength); archive.WriteEntry(entry, false); } // 确保归档数据完全写入文件 archive.Finish(); } } // 解压tar文件 string outputPath = @"path_to_desktop\tartest"; // 提前创建输出目录,避免因目录不存在引发异常 Directory.CreateDirectory(outputPath); using (var input = File.OpenRead(tarFile)) { using (var archive = TarArchive.CreateInputTarArchive(input, Encoding.UTF8)) { archive.ExtractContents(outputPath); } } }
内容的提问来源于stack exchange,提问作者Raiden Hi
相关产品推荐
相关产品推荐

