8

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

4

4 に答える 4

11

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);
}
于 2011-01-12T07:36:38.817 に答える
4

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

于 2011-01-12T07:36:52.393 に答える
2

編集: Leppie と Gabe の回答を参照してください。これを (削除するのではなく) 保持している唯一の理由は、長さが 4GB を超えると思われる場合に必要になる可能性があるためです。


gzipの場合、そのデータは直接利用できないようです-私はGZipStreamSharpZipLibの同等物を見てきました-どちらも機能しません。私が提案できる最善の方法は、ローカルで実行することです。

    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;
        }
    }
于 2011-01-12T07:27:58.740 に答える
-2
public static long mGetFileLength(string strFilePath)
{
    if (!string.IsNullOrEmpty(strFilePath))
    {
        System.IO.FileInfo info = new System.IO.FileInfo(strFilePath);
        return info.Length;
    }

    return 0; 
}
于 2011-01-12T07:19:06.933 に答える