Как распаковать файл.xz (lzma2) с помощью sharpcompress
Я скачал исходный код SharpCompress и создал простое консольное приложение для распаковки небольшого файла.xz. Следуя нескольким различным примерам на сайте github и другим примерам здесь на stackru, я не могу найти ни комбинаций, которые действительно работают для "разархивирования" файла.xz, ни каких-либо инструкций или документации. Кто-нибудь мог "разархивировать" файл.xz с помощью SharpCompress?
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 ответ
Как оказалось, и 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());
}