サイズが数 GB の zip ファイルがあります。解凍されたコンテンツのサイズを取得したいのですが、C# で実際にファイルを解凍したくありません。使用できるライブラリは何ですか? .gz ファイルを右クリックして [プロパティ] に移動すると、Archive
タブの下にTotalLength
この値を示すプロパティ名があります。しかし、C#を使用してプログラムで取得したい..何か考えはありますか?
3475 次
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の場合、そのデータは直接利用できないようです-私は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;
}
}
于 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 に答える