Problemas descomprimir um arquivo gzip em .NET
-
21-08-2019 - |
Pergunta
Eu agarrei o seguinte em algum lugar do código fora da Internet, e estou usando-o para arquivos gzip descomprimir, como http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3 -1.8.4.tar.gz , mas quando eu executá-lo, eu recebo uma exceção, afirmando que o número mágico não corresponde.
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;
}
O que há de errado com o código que poderia causar este problema?
Solução
O problema é que a URL que você especificou na sua pergunta não realmente dar um arquivo gzip. Leva o navegador para uma página onde você seleciona um espelho.
Se você alterar temporariamente o seu método Download
ao uso:
string text = wc.DownloadString(pUrl);
Console.WriteLine(text);
você verá todo o HTML para a seleção espelho.
Se você usar uma URL que é a real arquivo gz, por exemplo, http: //wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz em seguida, ele funciona bem.
Outras dicas
Eu não poderia obter o GZipStream para ler o arquivo é ligada, mas parece para descomprimir outra GZip arquivos muito bem. Por exemplo:
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
Talvez o arquivo que você vinculado é corrupto? Ou talvez ele usa um formato GZip não-padrão ou nova.
Eu usei DotNetZip com algum sucesso com arquivos .zip. De acordo com os docs Ele também funciona com GZip. Você pode dar biblioteca desse cara uma tentativa.
.NET não suporta o href="http://en.wikipedia.org/wiki/Tar_%28file_format%29" rel="nofollow noreferrer"> tar formato . gzip
é simplesmente um compressor de byte. Tar é o formato do recipiente.
ZIP e RAR , combina estes dois passos para você, mas eles não são bons para streaming de compressão.
Se bem me lembro, SharpZipLib tem suporte para o alcatrão.