如何使用 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) 文件的主要内容,如果未能解决你的问题,请参考以下文章