【发布时间】:2011-01-12 06:57:16
【问题描述】:
我有一个大小为几 GB 的压缩文件,我想获得解压缩内容的大小,但不想在 C# 中实际解压缩文件,我可以使用什么库?当我右键单击 .gz 文件并转到属性然后在 Archive 选项卡下有一个属性名称 TotalLength 显示此值。但我想使用 C# 以编程方式获取它。有什么想法吗?
【问题讨论】:
-
该信息可能存在于 gzip 标头中。但我无能为力。
我有一个大小为几 GB 的压缩文件,我想获得解压缩内容的大小,但不想在 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 文件的最后一个字节是未压缩的输入大小模 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;
}
【讨论】: