0

次のコードをインターネットのどこかで入手し、それを使用してhttp://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3-などの gzip ファイルを解凍しています。 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

4 に答える 4

3

問題は、質問で指定した 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を使用すると、正常に動作します。

于 2009-03-20T06:37:39.820 に答える
1

リンクしたファイルを 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 形式を使用している可能性があります。

于 2009-03-20T05:45:45.903 に答える
0

DotNetZipを使用して、.zip ファイルである程度成功しました。ドキュメントによると、GZip でも動作します。この男のライブラリを試してみてください。

于 2009-03-20T05:54:26.023 に答える
-1

.NET はtar形式をサポートしていません。gzip単なるバイト圧縮です。tar はコンテナー形式です。

ZIPRARなどの形式では、これらの両方の手順が組み合わされますが、ストリーミング圧縮には適していません。

私の記憶が正しければ、SharpZipLibは tar をサポートしています。

于 2009-03-20T05:47:52.793 に答える