Как распаковать вложенные файлы GZip (TGZ) в C # - PullRequest
4 голосов
/ 18 ноября 2009

Я получаю файл TGZ, который будет содержать один текстовый файл и, возможно, один или несколько вложенных файлов TGZ. Я понял, как распаковать основной файл TGZ и прочитать текстовый файл, содержащийся в нем, но я не смог понять, как распознать и распаковать вложенные файлы TGZ. Кто-нибудь сталкивался с этой проблемой раньше?

Кроме того, у меня нет контроля над файлом, который я получаю, поэтому я не могу изменить формат файла TGZ, содержащего вложенные файлы TGZ. Еще одно предупреждение (хотя я не думаю, что это имеет значение) заключается в том, что эти файлы сжимаются и сохраняются в среде Unix или Linux.

Заранее спасибо за любую помощь.

Ответы [ 3 ]

5 голосов
/ 18 ноября 2009

Попробуйте SharpZipLib (http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx) бесплатная библиотека.

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

4 голосов
/ 07 апреля 2010

Для чтения и записи файлов .tar и .tgz (или .tar.gz) из .NET вы можете использовать этот класс tar с одним файлом:

http://cheesoexamples.codeplex.com/SourceControl/changeset/view/97756#1868643

Очень простое использование. Чтобы создать архив:

string[] filenames = { ... };
Ionic.Tar.CreateArchive("archive.tar", filenames);

Создать сжатый (gzip'd) архив tar:

string[] filenames = { ... };
Ionic.Tar.CreateArchive("archive.tgz", filenames, TarOptions.Compress);

Прочитать архив tar:

var entries = Ionic.Tar.List("archive.tar");  // also handles .tgz files

Извлечение всех записей в архиве tar:

var entries = Ionic.Tar.Extract("archive.tar");  // also handles .tgz files
1 голос
/ 18 ноября 2009

Взгляните на DotNetZip на CodePlex.

"Если все, что вы хотите, это лучше DeflateStream или класс GZipStream для заменить тот, который встроен в .NET BCL, это тоже здесь. DotNetZip DeflateStream и GZipStream доступны в автономная сборка, основанная на .NET порт Злеб. Эти потоки поддерживают уровни сжатия и доставляют много лучшая производительность, чем встроенная классы. Существует также ZlibStream для завершить набор (RFC 1950, 1951, 1952). "

Похоже, что вы можете перебирать сжатый файл и извлекать отдельные файлы из архива. Затем вы можете проверить файлы, которые вы распаковали, и посмотреть, являются ли какие-либо из них самими файлами GZip.

Вот отрывок из их Примеры страниц

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  foreach (ZipEntry e in zip)
  {
    e.Extract(OutputStream);
  }
}

Keith

...