Проблемы распаковки архива gzip в .NET - PullRequest
0 голосов
/ 20 марта 2009

Я взял следующий код где-то в Интернете и использую его для распаковки gzip-файлов, таких как http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz,, но когда я запускаю его, я получаю исключение, утверждая, что магическое число не матч.

public byte[] Download(string pUrl) {
    WebClient wc = new WebClient();
    byte[] bytes = wc.DownloadData(pUrl);
    return UnGzip(bytes, 0);
}

private static byte[] UnGzip(byte[] data, int start) {
    int size = BitConverter.ToInt32(data, data.Length - 4);
    byte[] uncompressedData = new byte[size];
    MemoryStream memStream = new MemoryStream(data, start, (data.Length - start));
    memStream.Position = 0;
    GZipStream gzStream = new GZipStream(memStream, CompressionMode.Decompress);

    try {
        gzStream.Read(uncompressedData, 0, size);
    } catch (Exception gzError) {
        throw;
    }

    gzStream.Close();
    return uncompressedData;
}

Что не так с кодом, который может вызвать эту проблему?

Ответы [ 4 ]

3 голосов
/ 20 марта 2009

Проблема в том, что URL, который вы указали в своем вопросе, на самом деле не является файлом gzip. Он переводит браузер на страницу, где вы выбираете зеркало.

Если вы временно измените метод Download на

string text = wc.DownloadString(pUrl);
Console.WriteLine(text);

вы увидите весь HTML-код для выбора зеркала.

Если вы используете URL, который является фактическим gz файлом, например, http://wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz тогда все работает нормально.

1 голос
/ 20 марта 2009

Мне не удалось заставить GZipStream прочитать файл, который вы связали, но, похоже, он прекрасно распаковывает другие файлы GZip. Например:

FTP: //gnu.mirror.iweb.com/gnu/bash/bash-1.14.0-1.14.1.diff.gz

FTP: //gnu.mirror.iweb.com/gnu/emacs/elisp-manual-21-2.8.tar.gz

Возможно, файл, который вы указали, поврежден? Или, может быть, он использует нестандартный или новый формат GZip.

0 голосов
/ 20 марта 2009

Я использовал DotNetZip с некоторым успехом с файлами .zip. Согласно документам, он также работает с GZip. Вы могли бы попробовать библиотеку этого парня.

0 голосов
/ 20 марта 2009

.NET не поддерживает формат tar . gzip - это просто байтовый компрессор. Tar - это контейнерный формат.

Форматы, такие как ZIP и RAR , сочетают в себе оба этих шага, но они не подходят для потокового сжатия.

Если я правильно помню, SharpZipLib поддерживает tar.

...