Как распаковать файл.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());
}
Другие вопросы по тегам