質問

いくつかのGBSのサイズを備えたZippedファイルがあります。解凍されたコンテンツのサイズを取得したいのですが、実際にファイルをC#で解凍したくありません。使用できるライブラリは何ですか? .gzファイルを右クリックしてプロパティに移動してから、 Archive タブプロパティ名があります TotalLength この値を示しています。しかし、C#..何かのアイデアをプログラム的に取得したいですか?

役に立ちましたか?

解決

GZファイルの最後の4バイトには長さが含まれています。

だからそれは次のようなものでなければなりません:

using(var fs = File.OpenRead(path))
{
  fs.Position = fs.Length - 4;
  var b = new byte[4];
  fs.Read(b, 0, 4);
  uint length = BitConverter.ToUInt32(b, 0);
  Console.WriteLine(length);
}

他のヒント

.gzファイルのバイトの最後は、非圧縮入力サイズModulo 2^32です。非圧縮ファイルが4GBを超えていない場合は、ファイルの最後の4バイトを読むだけです。大きなファイルがある場合、ストリームを非圧縮せずに取得できるかどうかはわかりません。

編集:LeppieとGabeの回答をご覧ください。私がこれを保持している唯一の理由は(削除するのではなく)、長さが> 4GBであると疑っている場合に必要になる可能性があることです


GZIPの場合、そのデータは直接入手可能ではないようです - 私は見ました GZipStream そしてその Sharpziplib 同等 - どちらも機能しません。私が提案できる最善の方法は、それをローカルに実行することです:

    long length = 0;
    using(var fs = File.OpenRead(path))
    using (var gzip = new GZipStream(fs, CompressionMode.Decompress)) {
        var buffer = new byte[10240];
        int count;
        while ((count = gzip.Read(buffer, 0, buffer.Length)) > 0) {
            length += count;
        }
    }

それがzipの場合、Sharpziplib:

    long size = 0;
    using(var zip = new ZipFile(path)) {
        foreach (ZipEntry entry in zip) {
            size += entry.Size;
        }
    }
public static long mGetFileLength(string strFilePath)
{
    if (!string.IsNullOrEmpty(strFilePath))
    {
        System.IO.FileInfo info = new System.IO.FileInfo(strFilePath);
        return info.Length;
    }

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