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

时间:2018-04-26 20:21:40

标签: c# .net xz sharpcompress

我已经下载了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);
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:3)

事实证明,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());
}