【问题标题】:How to get the size of a compressed file without actually compressing it [SharpZipLib]如何在不实际压缩的情况下获取压缩文件的大小 [SharpZipLib]
【发布时间】:2015-12-15 14:27:37
【问题描述】:

在 SharpZipLib 中,我们像这样使用 ZipEntry:

            var fi = new FileInfo(file);
            var ze = new Sharp.Zip.ZipEntry(fi.Name);
            ze.DateTime = fi.LastAccessTime;
            ze.Size = fi.Length;
            stream.PutNextEntry(ze);

            var buffer = new byte[4096];
            var byteCount = 0;

            using (FileStream inputStream = File.OpenRead(fi.FullName))
            {
                byteCount = inputStream.Read(buffer, 0, buffer.Length);
                while (byteCount > 0)
                {
                    stream.Write(buffer, 0, byteCount);
                    byteCount = inputStream.Read(buffer, 0, buffer.Length);
                }
                inputStream.Close();
            }
            stream.CloseEntry();

有一个 ze.CompressedSize 属性,但它是 -1 并且仅在创建 zip 文件的 CloseEntry() 之后填充。

有没有办法在不放置文件并实际创建它的情况下找出 zip 文件的压缩大小。

【问题讨论】:

  • 你确定它不是在你CloseEntry之后自动填充的吗?
  • 我更正了最后一句话。
  • without putting the files - 不,那是不可能的。所有压缩算法都是通过减少数据中的冗余来工作的,并且无法(无法)提前知道可以达到什么程度。

标签: c# sharpziplib


【解决方案1】:

最简单的方法是使用 ZipOutputStream 创建一个虚拟 zip 文件, 以底层 MemoryStream 为后盾。将文件写入该文件 - make 确保设置相同的压缩系数 - 并关闭 ZipOutputStream,使用 ZipFile 重新打开它,然后扫描条目以 获取压缩后的大小。

有一个例子here

【讨论】:

    最近更新 更多