質問

私はインターネットのどこかから次のコードを入手し、それを使用して次のような 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;
}

この問題を引き起こすコードの何が問題なのでしょうか?

役に立ちましたか?

解決

問題は、あなたの質問に指定されたURLは、実際にgzipファイルを与えないということです。それはあなたがミラーを選択するページにブラウザをとります。

あなたは一時的に使用するようにDownload方法を変更した場合:

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

あなたはミラーの選択のためのすべてのHTMLが表示されます。

は、の実際ののGZファイルであるURL、例えばを使用している場合ます。http: //wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz のは、それが正常に動作します。

他のヒント

私は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の-手動21-2.8.tar.gzする

おそらく、あなたがリンクされたファイルが壊れていますか?それとも、それは非標準または新しいgzip形式を使用します。

私は.zipファイルといくつかの成功を収めて DotNetZip に使用しました。ドキュメントによると、それはまた、gzipで動作します。あなたは、この男のライブラリを試してみるかもしれません。

.NET はサポートしていません タール フォーマット。 gzip 単なるバイト圧縮器です。Tar はコンテナ形式です。

のような形式 ジップ そして RAR, では、これら両方の手順を組み合わせますが、ストリーミング圧縮には適していません。

もし私が正確に覚えていれば、 シャープジップリブ tar をサポートしています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top