【问题标题】:TarArchive Hangs When Trying to Extract Contents尝试提取内容时 TarArchive 挂起
【发布时间】:2022-10-02 01:12:14
【问题描述】:

我正在尝试创建一个 tar 存档,然后使用 SharpZipLib 将所有内容提取到一个文件中。我能够创建 tar 存档,但在尝试提取它时程序挂起。我想知道是否有其他人可以重现这个问题,看看它为什么会发生。我也尝试过使用an example that allows for full control,并且在调试时,似乎我的程序在调用tarIn.GetNextEntry() 时挂起。

这是我的代码

public void CreateTarAndExtract()
        {
            // create tar file
            string tarFile = \"path_to_desktop\\\\tartest.tar\";
            string inputFolder = \"path_to_desktop\\\\testfolder\";
            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);
                        entry.Name = fsEntry.Substring(trimLength);
                        archive.WriteEntry(entry, false);
                    }
                }
            }

            // extract file
            string outputPath = \"path_to_desktop\\\\tartest\";
            using (var input = File.OpenRead(tarFile))
            {
                using (var archive = TarArchive.CreateInputTarArchive(input, Encoding.UTF8))
                {
                    archive.ExtractContents(outputPath);
                }
            }
        }
  • 我复制了您的代码,结果完全相同,应用程序冻结,我正在尝试解决问题
  • 仅供参考:.NET 7 在 System.Formats.Tar 命名空间中提供与 tar 相关的功能。尽管 .NET 7 还没有最终版本,但如果您有兴趣尝试 System.Formats.Tar 的东西,则可以使用候选版本...

标签: c# .net tar sharpziplib


【解决方案1】:

我可以这样解压 tar 档案:

    // extract file
    string outputPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "tartest");
    using (var input = File.OpenRead(tarFile))
    {
        ExtractTar(input, outputPath);
    }

    /// <summary>
    /// Extractes a <c>tar</c> archive to the specified directory.
    /// </summary>
    /// <param name="stream">The <i>.tar</i> to extract.</param>
    /// <param name="outputDir">Output directory to write the files.</param>
    public static void ExtractTar(Stream stream, string outputDir)
    {
        var buffer = new byte[100];
        while (true)
        {
            stream.Read(buffer, 0, 100);
            var name = Encoding.ASCII.GetString(buffer).Trim('\0');
            if (String.IsNullOrWhiteSpace(name))
                break;
            stream.Seek(24, SeekOrigin.Current);
            stream.Read(buffer, 0, 12);
            var size = Convert.ToInt64(Encoding.UTF8.GetString(buffer, 0, 12).Trim('\0').Trim(), 8);

            stream.Seek(376L, SeekOrigin.Current);

            var output = Path.Combine(outputDir, name);
            if (!Directory.Exists(Path.GetDirectoryName(output)))
                Directory.CreateDirectory(Path.GetDirectoryName(output));
            if (!name.Equals("./", StringComparison.InvariantCulture))
            {
                using (var str = File.Open(output, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    var buf = new byte[size];
                    stream.Read(buf, 0, buf.Length);
                    str.Write(buf, 0, buf.Length);
                }
            }

            var pos = stream.Position;

            var offset = 512 - (pos % 512);
            if (offset == 512)
                offset = 0;

            stream.Seek(offset, SeekOrigin.Current);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    相关资源
    最近更新 更多