Как извлечь любые архивы с помощью SharpZipLib?

Я использую SharpZipLib для извлечения архивов. Мне удалось распаковать архивы .zip:

FastZip fastZip = new FastZip();

fastZip.ExtractZip(file, directory, null);

и извлечь .tar.gz:

// Use a 4K buffer. Any larger is a waste.    
byte[] dataBuffer = new byte[4096];

using (Stream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
{
    using (GZipInputStream gzipStream = new GZipInputStream(fileStream))
    {
        // Change this to your needs
        string fnOut = Path.Combine(directory, Path.GetFileNameWithoutExtension(file));

        using (FileStream fsOut = File.Create(fnOut))
        {
            StreamUtils.Copy(gzipStream, fsOut, dataBuffer);
        }
    }
}

Есть ли способ извлечь любой архив, где мне не нужно заранее знать тип архива? (например, SharpZipLib.ExtractAnyArchive(file, directory))


person Mathias    schedule 03.12.2018    source источник
comment
Если вам необходимо использовать SharpZipLib, вам не повезло. Затем вам нужно будет вручную попытаться открыть каждый тип формата архива, поддерживаемый SharpZipLib, пока вы не найдете тот, который действительно успешно обрабатывает файл; или вам нужно будет реализовать определение формата самостоятельно. В противном случае, если вы не обязаны использовать именно SharpZipLib, вы можете поискать альтернативную библиотеку, такую ​​как SharpCompress, которая способна автоматически определять поддерживаемые типы архивов (см. здесь несколько простых примеров: github.com/adamhathcock/sharpcompress/wiki/API-Examples).   -  person    schedule 03.12.2018
comment
На самом деле я перешел с SharpCompress на SharpZipLib, потому что SharpCompress неправильно создает tar-архивы. В любом случае, это то, с чем мне приходится иметь дело. Большое спасибо! Если вы опубликуете это как ответ, я приму это.   -  person Mathias    schedule 03.12.2018
comment
Э-э, жаль слышать, что SharpCompress создал для вас проблемы. Я должен признать, что уже несколько лет не использую SharpCompress. Я помню, что когда-то нуждался в поддержке 7z, а поддержка 7z в SharpCompress в то время была довольно слабой. Другие библиотеки, обещавшие поддержку 7z, были еще хуже или устарели, поэтому мне пришлось напрямую взаимодействовать с 7-Zip DLL. С тех пор использование 7-Zip DLL всегда удовлетворяло мои потребности (она также поддерживает несколько форматов архивов и способна определять форматы архивных файлов/потоков).   -  person    schedule 03.12.2018


Ответы (1)


SharpZipLib, к сожалению, в настоящее время не может автоматически определять формат архивного файла/потока.

Вы либо должны реализовать функциональность самостоятельно в той или иной форме, либо искать альтернативную библиотеку, способную автоматически определять формат архива. Примером такой библиотеки может быть SharpCompress, однако, как вы уже отметили в комментариях, разные библиотеки могут иметь разные ограничения и ошибки, которые могут повлиять на функциональность вашего программного обеспечения.

Если вы решите внедрить собственную функцию автоматического обнаружения для SharpZipLib, вы можете выбрать разные подходы, например

  • Попробуйте открыть (неизвестный) архив, используя классы архива (чтения/потока) для каждого формата архива, поддерживаемого SharpZipLib, пока не найдете тот, который может успешно открыть и обработать файл архива.

  • Реализуйте некоторую процедуру обнаружения формата, которая сканирует архивный файл/поток на наличие «магических» байтов подписи, идентифицирующих конкретный формат архива. Если таким образом был идентифицирован формат архивного файла/потока, выберите и используйте соответствующие классы SharpZipLib для обработки обнаруженного формата архива.

person Community    schedule 03.12.2018