我有一个大小为几个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文件的字节的最后一个是未压缩的输入大小modulo 2^32。如果您的未压缩文件不大于4GB,则只需阅读文件的最后4个字节即可。如果您有较大的文件,我不确定在不压缩流的情况下可以获得。

编辑:请参阅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;
        }
    }

如果是拉链,那么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