Как распаковать архив 7z с C # .NET 3.5? - PullRequest
0 голосов
/ 17 мая 2019

Я хочу, чтобы мое приложение использовало файлы из файла .7z.

Я нашел несколько объяснений , как распаковать файл 7z . Однако все они касаются случая, с которым я еще не сталкивался в дикой природе: архив, который распаковывается в один файл. Я ожидаю, что архив .7z будет распакован в произвольное количество файлов, возможно, в произвольные подпапки.

Похоже, можно было бы сделать это с помощью , включая все 7zip-приложение, а затем запустить его в процессе . Однако это кажется ненужными дополнительными шагами, учитывая, что существует официальный LZMA SDK . Кроме того, это приводит к проблемам, связанным с перекрестной совместимостью.

Итак, как мне распаковать архив .7z в заданную папку, используя в C # (.NET 3.5)?

Дополнительная информация из комментариев

" Пожалуйста, покажите код, который не работает. "
Ну, на данный момент я использую вторую половину этого ответа на другой вопрос. Тем не менее, я ожидаю , что не будет делать то, что я хочу - output (точно так же как input) - это FileStream, поэтому ясно, что это создает только один файл.
Он показывает, что Decoder - это класс, выполняющий распаковку, но у него нет метода, который работает, например, с. DirectoryInfo, string путь или что-то в этом роде - все это один файл, один файл . Каждая информация, которую я нашел при использовании SDK, делает то же самое; Я не нашел ни одного, извлекающего архив из нескольких файлов.

1 Ответ

0 голосов
/ 24 мая 2019

Я пришел к следующему выводу:

Распаковка архива .7z в папку не является функцией, предоставляемой C # LZMA SDK.

Боюсь, я не нашел каких-либо веских доказательств, как, например, сообщение в блоге, прямо заявляющее об этом.

Однако я нашел описание .7z формата файла . Это описание не предоставило достаточно технических деталей для создания рабочего решения, но оно содержало некоторые факты о формате:

В этом разделе я объясню, как предыдущий пример хранится в структурированных данных [...]

Прежде всего, это заголовок, который содержит только две переменные: FileInfo и StreamsInfo.

FileInfo, вероятно, самая простая для понимания структура. Он содержит имя каждого файла в 7z и пару других флагов, определяющих, является ли файл каталогом или файл является пустым.

Насколько я вижу, эта структура не отражена в коде C # SDK. Это в сочетании с информацией о том, что методы Decoder.Code() не работают с путем к каталогу или более чем одним выводом Stream, является сильным показателем.

Таким образом, кажется, что часть C # LZMA SDK обрабатывает и дешифрует только один файл или «Сжатый поток», как он вызывается в связанном документе. Формат архива .7z считается отдельным форматом, который в конечном итоге представляет собой структуру, содержащую произвольное количество сжатых потоков.

Эти потоки могут фактически быть объединены, опять же, произвольными способами; например архив может содержать файлы A и B, сжатые с помощью LZMA, затем добавить файл C к миксу и снова сжать его с помощью другого алгоритма. Это усложняет распаковку архива .7z, что еще более жаль, что эта функция не предоставляется в SDK.

...