Как распаковать файл .xz (lzma2) с помощью sharpcompress - PullRequest
0 голосов
/ 26 апреля 2018

Я скачал исходный код SharpCompress и создал простое консольное приложение для распаковки небольшого файла .xz. Следуя нескольким различным примерам на сайте github и другим примерам здесь на stackoverflow, я не могу найти ни комбинаций, которые действительно работают для «разархивирования» файла .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 Ответ

0 голосов
/ 27 апреля 2018

Как оказалось, 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());
}
...