2009-03-20 3 views
0

Ich habe den folgenden Code irgendwo aus dem Internet gegriffen, und ich benutze es um Gzip-Dateien zu entpacken, wie http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz, aber wenn ich es ausführe, bekomme ich eine Ausnahme, die Magie Nummer stimmt nicht überein.Probleme beim Dekomprimieren eines gzip-Archivs in. NET

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 an dem Code, der dieses Problem verursachen würde?

+0

Können Sie den Code anzeigen, der das byte [] Datenarray erhält? – JaredPar

+0

Hinzugefügt, was Sie angefordert haben. – Ash

Antwort

3

Das Problem ist, dass die URL, die Sie in Ihrer Frage angegeben haben, keine gzip-Datei gibt. Es führt den Browser zu einer Seite, auf der Sie einen Spiegel auswählen.

Wenn Sie vorübergehend Ihre Download Methode ändern zu verwenden:

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

Sie alle HTML für Spiegel Auswahl sehen.

Wenn Sie eine URL verwenden, die die tatsächliche gz-Datei ist, z. http://wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz dann funktioniert es gut.

-1

.NET unterstützt das Format tar nicht. gzip ist einfach ein Byte-Kompressor. Tar ist das Containerformat.

Formate wie ZIP und RAR, kombiniert diese beiden Schritte für Sie, aber sie sind nicht gut für Streaming-Komprimierung. Wenn ich mich richtig erinnere, hat SharpZipLib Unterstützung für Teer.

0

Ich habe DotNetZip mit einigem Erfolg mit .zip-Dateien verwendet. Laut den Dokumenten funktioniert es auch mit GZip. Du könntest die Bibliothek dieses Kerls ausprobieren.

+0

DotNetZip verwendet GZIP, genau wie die integrierte GZipStream-Klasse. Die Verwendung von DotNetZip würde den vom OP angebotenen Code mit Ausnahme der Namespaces nicht ändern. Der Hauptvorteil von DotNetZip besteht darin, dass es bei der Komprimierung effektiver ist. Kein Vorteil in der Dekompression. – Cheeso

Verwandte Themen