我知道有很多免费且不那么免费的压缩库,但对于我正在处理的项目,我需要能够从流中获取文件数据并将其放入某种类型的zip或pack文件中,但没有压缩,因为我需要快速访问这些文件,而不必等待它们解压缩。
任何人都知道如何处理这个问题,或者是否有一些库那样做我不知道的?
答案 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:
答案 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实现仍有待测试。