无需压缩即可创建zip样式文件

时间:2009-01-10 13:51:53

标签: c#

我知道有很多免费且不那么免费的压缩库,但对于我正在处理的项目,我需要能够从流中获取文件数据并将其放入某种类型的zip或pack文件中,但没有压缩,因为我需要快速访问这些文件,而不必等待它们解压缩。

任何人都知道如何处理这个问题,或者是否有一些库那样做我不知道的?

6 个答案:

答案 0 :(得分:9)

您可以使用Zip。您可以使用类似“none”或“store”的压缩级别,它只是在没有压缩的情况下组合文件。 This site列举其中一些:

  
      
  • 最大 - 最慢的   压缩选项,但最多   用于创建小型档案。
  •   
  • 正常 - 默认值。
  •   
  • 低 - 比默认速度快,但是   效果不佳。
  •   
  • 最低 - 非常快   压缩,但效率不高   其他方法。
  •   
  • - 创建ZIP文件但确实存在   不压缩它。文件大小可能是   如果存档是稍微大一点   加密或自解压。
  •   

以下是一些C#示例:

对于unix没有意识到,这正是tar所做的。当你看到.tar.gz文件时,它只是一堆文件组合成一个tar文件,然后通过gzip运行。

答案 1 :(得分:8)

查看System.IO.Packaging命名空间。

来自MSDN:

  

System.IO.Packaging程序

     

提供支持存储的类   一个中的多个数据对象   容器

     

Package是一个可以的抽象类   用于将对象组织成一个   已定义物理的单一实体   便携性和高效的格式   访问。

     

ZIP文件是主要的物理文件   包的格式。其他套餐   实现可能会使用其他   物理格式,如XML   文档,数据库或Web服务。

您可以为包选择不同的compression options

  • 未压缩 - 关闭压缩。
  • 正常 - 针对尺寸和尺寸之间的平衡优化压缩 性能
  • 最高 - 针对优化压缩 大小
  • 快速 - 优化压缩 性能
  • SuperFast - 针对高性能优化了压缩。

答案 2 :(得分:4)

也许只使用压缩设置为“none”的zip; SharpZipLib就足够了。

小心假设压缩速度较慢 - 实际上(取决于场景)压缩可能更快,因为您减少了物理IO和IPC的数量(通常是瓶颈) ,简单地做一点CPU工作;但是你通常有足够的CPU。

答案 3 :(得分:1)

Windows下的传统简单存储文件是cabinet文件,它支持压缩和签名,zip不支持。

注意是否有办法在.net。

中创建cabinet文件

答案 4 :(得分:1)

请记得首先介绍一下。你的硬盘驱动器比你的cpu或ram慢得多。如果文件位于磁盘上,则读取较小的压缩文件所需的时间比读取未压缩的blob要少。差异可能超过解压缩所需的时间。

OS也可以将文件缓存在内存中。当发生这种情况时,硬盘驱动器将完全从环路中移除(对您来说是透明的)。这可能会使减压时间过于昂贵。

我在处理慢速互联网连接时学到了这种“技巧”。客户需要快速的数据,我们有足够的周期。发送压缩数据包会增加应用程序的吞吐量/延迟。

答案 5 :(得分:0)

我还要求使用标准工具(至少是FAR Manager)浏览生成的包文件。

到目前为止,我已尝试过:

  • OPC (打开包装约定,System.Packaging命名空间,基于ZIP,MSO .docx文件的后端)。内置和标准,但相当慢,可能是因为它实际上首先将所有数据复制到临时位置,以防它必须被压缩(即使它不是这样),然后才写入最终目的地。难以忍受的慢。请注意,还有一个不是基于.NET的Windows内置实现,可能更快,但不会跨越我必须支持的所有操作系统版本。

  • ITSS (InfoTech存储系统,CHM文件的后端)。内置于Windows,有点标准。令人惊讶的是,实施是不完整的,它的速度非常慢,甚至比OPC慢。

  • DOC (COM复合文件结构化存储,MSO .doc文件的后端,.msi文件等)。内置于Windows,非常标准。不支持超过32个字符的文件名,这在我的情况下是一个重大缺陷。在中小尺寸上足够快(完全超出.NET OPC impl),但在达到千兆字节时会出现一些可扩展性问题。

各种ZIP实现仍有待测试。