You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:15:36