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

4

我已经下载了SharpCompress源代码,并创建了一个简单的控制台应用程序来解压一个小的.xz文件。在github网站上跟随了几个不同的示例和其他一些stackoverflow上的示例后,我无法找到任何可以实际工作的组合来“解压缩” .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。https://tukaani.org/xz/xz-file-format-1.0.4.txt - glenebob
是的。我已经做了那件事,并且它确实与神奇的前六个字节匹配。我甚至使用了sharpcompress XZStream.IsXZStream(stream)来检查它,返回true。 - mobiletonster
我能够使用自己的.XZ文件重现此问题。看起来.XZ支持不完整,而ReaderFactory非常不稳定。我找到了一个参考资料:https://github.com/sambott/XZ.NET。使用该库,我能够解压缩我的文件。也许这对你有用。 - glenebob
有趣。我克隆了XZ.NET存储库,看起来它引用SharpCompress作为依赖项。不确定这个特定的“包装器”正在做什么或如何使用它。如果它对您有用,您能否分享一下您用于解压缩xz文件的代码? - mobiletonster
1个回答

5

事实证明,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满意,但这不应该太难。 - mobiletonster
感谢您分享代码,我认为这是整个互联网上唯一可用的代码示例。 :D - Bimal Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接