質問
いくつかの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;
}
所属していません StackOverflow