Probleme Dekomprimieren ein gzip-Archiv in .NET
-
21-08-2019 - |
Frage
Ich packte den folgenden Code irgendwo aus dem Internet, und ich bin mit ihm gzip-Dateien wie http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3 -1.8.4.tar.gz , aber wenn ich es laufen lasse, erhalte ich eine Ausnahme, die besagt, dass die magische Zahl nicht übereinstimmt.
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;
}
Was ist falsch mit dem Code, der dieses Problem verursachen würde?
Lösung
Das Problem ist, dass die URL, die Sie in Ihrer Frage angegeben nicht wirklich einer gzip-Datei geben. Es nimmt den Browser auf eine Seite, wo Sie einen Spiegel aus.
Wenn Sie vorübergehend Ihre Download
Methode ändern zu verwenden:
string text = wc.DownloadString(pUrl);
Console.WriteLine(text);
Sie werden alle HTML-Code für Spiegel Auswahl sehen.
Wenn Sie eine URL verwenden, das ist die eigentlichen gz-Datei, zum Beispiel http: //wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz dann funktioniert es gut.
Andere Tipps
Ich kann nicht die GZipStream bekommen Sie die Datei verknüpft zu lesen, aber es scheint, andere GZIP-Dateien zu dekomprimieren gut. Zum Beispiel:
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
Vielleicht ist die Datei, die Sie korrupt verknüpft ist? Oder vielleicht verwendet es ein Nicht-Standard oder neues GZIP-Format.
Ich habe verwendet DotNetZip mit einigem Erfolg mit ZIP-Dateien. Nach dem docs es funktioniert auch mit gzip. Sie könnten diesem Kerl Bibliothek versuchen.
.NET unterstützt nicht das tar Format. gzip
ist einfach ein Byte Kompressor. Tar ist das Container-Format.
Formate wie ZIP und RAR , kombiniert diese beiden Schritte für Sie, aber sie sind nicht gut für die Kompression Streaming.
Wenn ich mich richtig erinnere, SharpZipLib hat die Unterstützung für Teer.