【问题标题】:GZIP file Total length in C#GZIP 文件 C# 中的总长度
【发布时间】:2011-01-12 06:57:16
【问题描述】:

我有一个大小为几 GB 的压缩文件,我想获得解压缩内容的大小,但不想在 C# 中实际解压缩文件,我可以使用什么库?当我右键单击 .gz 文件并转到属性然后在 Archive 选项卡下有一个属性名称 TotalLength 显示此值。但我想使用 C# 以编程方式获取它。有什么想法吗?

【问题讨论】:

  • 该信息可能存在于 gzip 标头中。但我无能为力。

标签: c# gzip gunzip


【解决方案1】:

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);
}

【讨论】:

  • 啊,好多了;我不确定当 >4GB 时如何处理这个问题
  • 感谢 Leppie...实际上在我的情况下文件将小于 4GB...感谢您的帮助...
  • @leppie 没问题,感谢的精彩回答。
【解决方案2】:

.gz 文件的最后一个字节是未压缩的输入大小模 2^32。如果您的未压缩文件不大于 4GB,则只需读取文件的最后 4 个字节。如果您有更大的文件,我不确定是否可以在不解压缩流的情况下获得。

【讨论】:

    【解决方案3】:

    编辑:查看 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;
            }
        }
    

    【讨论】:

    • 谢谢 Marc,第一种方法对我有用.. 但是计算 2 GB 未压缩文件需要很长时间......而且应该是我们在循环中计数......不是有什么快速的方法吗?
    • @Ummar:Gabe 和我自己都解释了这样做的“正确”方式。上面的方法可行,但想象一下在 1000 个 2GB 的文件上使用它,这将需要很长时间。
    • @Ummar - 见@leppie 的回答
    【解决方案4】:
    public static long mGetFileLength(string strFilePath)
    {
        if (!string.IsNullOrEmpty(strFilePath))
        {
            System.IO.FileInfo info = new System.IO.FileInfo(strFilePath);
            return info.Length;
        }
    
        return 0; 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      相关资源
      最近更新 更多