如何使用 sharpcompress 解压 .xz (lzma2) 文件

Posted

技术标签:

【中文标题】如何使用 sharpcompress 解压 .xz (lzma2) 文件【英文标题】:How to unpack a .xz (lzma2) file using sharpcompress 【发布时间】:2018-04-26 20:21:40 【问题描述】:

我已经下载了 SharpCompress 源代码并创建了一个简单的控制台应用程序来解压缩一个小的 .xz 文件。在github站点上的几个不同示例和***上的其他示例之后,我找不到任何真正适用于“解压缩” .xz 文件的组合,也找不到任何说明或文档。有没有人真正能够使用 SharpCompress“解压缩”一个 .xz 文件?

        using (Stream stream = File.OpenRead(@"C:\temp\ot.xz"))
        
            using (var reader = ReaderFactory.Open(stream))
            
                while (reader.MoveToNextEntry())
                
                    if (!reader.Entry.IsDirectory)
                    
                        Console.WriteLine(reader.Entry.Key);
                        reader.WriteEntryToDirectory(@"C:\temp", new ExtractionOptions()
                        
                            ExtractFullPath = true,
                            Overwrite = true
                        );
                    
                
            
        

此特定代码引发异常“无法确定压缩流类型。支持的阅读器格式:Zip、GZip、BZip2、Tar、Rar、LZip、XZ'

以下代码效果更好(不会引发错误),但 Entry.Key 值是意外或乱码。

        using (Stream stream = File.OpenRead(@"C:\temp\ot.xz"))
        
            var xzStream = new XZStream(stream);
            using (var reader = TarReader.Open(xzStream))// ReaderFactory.Open(stream))
            
                while (reader.MoveToNextEntry())
                
                    if (!reader.Entry.IsDirectory)
                    
                        Console.WriteLine(reader.Entry.Key);
                    
                
            
        

【问题讨论】:

您确定这是一个有效的 .XZ 文件吗?我建议在十六进制编辑器中打开它并检查魔法(前六个字节),它应该是 FD 37 7A 58 5A 00。tukaani.org/xz/xz-file-format-1.0.4.txt 是的。我已经做到了,它确实与神奇的前六个字节相匹配。我什至使用了sharpcompress XZStream.IsXZStream(stream) 来检查它,它返回true。 我能够使用自己的 .XZ 文件重现此问题。 .XZ 支持似乎不完整,并且 ReaderFactory 非常损坏。我找到了对这个 repo 的引用:github.com/sambott/XZ.NET。使用该库,我可以解压缩我的文件。也许这对你有用。 有趣。我克隆了 XZ.NET 存储库,看起来它引用了 SharpCompress 作为依赖项。不确定这个特定的“包装器”在做什么或如何使用它。如果它对你有用,你介意分享你用来解压你的 xz 文件的代码吗? 【参考方案1】:

事实证明,SharpCompress 和 XZ.NET 都可以使用相同的简单客户端代码工作。

但是请注意,我测试的其中一个文件导致 XZ.NET 在尝试读取流结束时引发异常,如下面的两个示例所示。 SharpCompress 正确处理了这两个文件。

using (Stream xz = new XZStream(File.OpenRead(@"\temp\server.crt.xz")))
using (Stream stream = new MemoryStream())

    xz.CopyTo(stream);

或者,对于压缩的纯文本:

using (Stream xz = new XZStream(File.OpenRead(@"\temp\server.crt.xz")))
using (TextReader reader = new StreamReader(xz))

    Debug.WriteLine(reader.ReadToEnd());

【讨论】:

谢谢。我也注意到了这一点。似乎我可以只使用 SharpCompress 库(在我的情况下我使用了 xz.CopyTo(fileStream) ,因为我想“解压缩”内容并且它工作正常。最终,我将在 UWP 应用程序中使用 xz 库代码,所以对于 XZ.NET 库(针对 .net 标准 1.1)来说是兼容的,但看起来我需要在 SharpCompress 上做一些工作才能让 UWP 开心,但这应该不会太难. 感谢您分享代码,我认为这是整个互联网上唯一可用的代码示例。 :D

以上是关于如何使用 sharpcompress 解压 .xz (lzma2) 文件的主要内容,如果未能解决你的问题,请参考以下文章

tar.xz文件如何解压

如何使用 7z SDK 压缩和解压 XZ 文件

tar.xz文件如何解压

如何在 Java 中更快地解压 XZ 文件?

如何解压.tar.xz

PCB 无需解压,直接读取Genesis TGZ指定文件 实现方法