【问题标题】:Efficient compression of folder with same file copied multiple times多次复制相同文件的文件夹的有效压缩
【发布时间】:2013-08-28 14:59:09
【问题描述】:

我正在使用 Ionic.Zip 创建一个*.zip。但是,我的*.zip 包含多次相同的文件,有时甚至 20 倍,而 ZIP 格式根本没有利用它。

更糟糕的是,Ionic.Zip 有时会因OutOfMemoryException 而崩溃,因为我将文件压缩成MemoryStream

是否有一个 .NET 库来利用文件之间的冗余进行压缩?

用户自行解压文件,所以不能是外来格式。

【问题讨论】:

  • 为什么需要多次存储同一个文件?
  • 在不同的文件夹中。用户修改他想要的文件,然后将它们发回(他可能只想修改一些版本)
  • 一般来说你应该尽量避免重复信息。如果同一个文件用于多种用途,那么您可以创建一个映射文件来指示哪些文件用于每种用途。然后用户可以修改映射文件以指示他们选择的新文件应该用于给定目的。
  • 用户希望在标准存档中看到许多单独的文件。
  • 你错了,zip格式单独压缩每个文件。

标签: c# compression zip


【解决方案1】:

我最终使用 SharpZipLib 库创建了一个 tar.gz。在 1 个文件上使用此解决方案,存档为 3kB。在 20 个相同的文件上使用它,存档只有 6kB,而在 .zip 中为 64kB。

Nuget:

Install-Package SharpZipLib

用途:

using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar;

代码:

var output = new MemoryStream();
using (var gzip = new GZipOutputStream(output))
using (var tar = TarArchive.CreateOutputTarArchive(gzip))
            {
                for (int i = 0; i < files.Count; i++)
                {                    
                    var tarEntry = TarEntry.CreateEntryFromFile(file);                    
                    tar.WriteEntry(tarEntry,false);
                }

                tar.IsStreamOwner = false;
                gzip.IsStreamOwner = false;
            }

【讨论】:

    【解决方案2】:

    不,众所周知的 API(例如 GZip、PPMd、Zip、LZMA)没有公开此类 API。它们都针对每个文件(或者更具体的字节流)进行操作。

    您可以连接所有文件,即使用 tar-ball 格式,然后使用压缩算法。

    或者,实现自己的检查很简单:计算文件的哈希并将其存储在哈希文件名字典中。如果下一个文件的哈希匹配,您可以决定要做什么,例如完全忽略此文件,或者可能记下其名称并将其保存在另一个文件中以标记重复。

    【讨论】:

    • .tar.gz 可以正常工作,因为它会归档所有文件然后压缩它们。这个答案在技术上是正确的,因为这是一个使用 tar 和 gzip 的两步过程,但大多数解压缩工具都可以无缝处理。
    • 任何用于创建 .tar.gz 的 .NET 库?
    • @TomasGrosup 我自己从未以编程方式使用过一个,但有一个question on this one
    【解决方案3】:

    是的,7-zip。您可以使用 SevenZipSharp 库,但根据我的经验,直接使用命令行启动压缩过程要快得多。

    我的个人经历: 我们在一家公司中使用 SevenZipSharp 解压缩高达 1GB 的档案,它非常慢,直到我对其进行了重新设计,以便它可以通过运行其命令行界面直接使用 7-zip 库。然后它就和在 Windows 资源管理器中手动解压缩时一样快。

    【讨论】:

    • launching compressing process directly using command line is much faster 没什么好老的System.Diagnostics.Process.Start() 解决不了的 ;)
    【解决方案4】:

    我没有对此进行测试,但根据How many times can a file be compressed? 中的一位回答者的说法

    如果您有大量重复文件,则 zip 格式将分别单独压缩,然后您可以压缩第一个 zip 文件以删除重复的 zip 信息。

    【讨论】:

    • 用户必须查看存档中的所有单个文件,而不仅仅是其中一个。
    • @TomasGrosup:我不确定你的意思,双压缩可以让你看到单个文件。
    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    相关资源
    最近更新 更多