从流式存档即时解压缩和提取文件

问题描述:

我正在编写一个浏览器插件,类似于Flash和Java,因此它一开始显示就开始下载文件(.jar或.swf)。 Java等待(我相信),直到整个jar文件被加载,但Flash不。我需要相同的功能,但是需要压缩的存档文件。只要下载解压缩所需的字节,我想立即访问存档中的文件。从流式存档即时解压缩和提取文件

例如,我正在将档案下载到内存缓冲区中,只要第一个文件可以解压缩,我想能够解压缩它(也存储到内存缓冲区)。

是否有任何格式/库支持?

编辑:如果可能,我更喜欢单个文件格式,而不是单独的压缩和存档格式,如gz/bzip2和tar。

+0

您找到了什么解决方案? – 2016-02-23 01:58:24

这里有

  1. 2个问题如何编写代码。

  2. 使用什么格式。

在文件格式上,您不能使用.ZIP格式,因为.ZIP会将目录放在文件末尾。这意味着您必须先下载整个文件,然后才能知道其中的内容。 Zip有可以扫描的标题,但这些标题不是文件内容的正式列表。

Zip明确地将目录放在最后,因为它允许快速添加文件。

假设您有一个包含文件'a','b'和'c'的zip文件。你想更新'c'。在zip中完全有效的读取目录,附加新的c,写一个指向新'c'的新目录,但旧的'c'仍然在文件中。如果您扫描标题,您最终会看到旧的'c',因为它仍在文件中。

此附加功能是zip的明确设计目标。它来自20世纪80年代,当一个拉链可以跨越多张软盘。如果你需要添加一个文件,那么为了重新写入整个zip文件,必须读取所有N个光盘。因此,格式只是让您将更新的文件追加到最后,这意味着它只需要最后一张光盘。它只是读取旧的TOC,追加新的文件,写入新的TOC。

Gzipped tar文件没有这个问题。Tar文件存储在标题,文件,头文件中,并且压缩是最重要的,因此可以将它解压缩为下载的文件并在文件可用时使用它们。您可以使用winrar(commercial)或7-zip(free)在linux中轻松地在windows中创建gzipped tar文件,并且在Linux上,osx和cygwin使用tar命令。

在写代码,

O3D做到这一点,是开源的,所以你可以看一下代码 http://o3d.googlecode.com

解压码是O3D /进口/交叉/ ...

它使用可在o3d/plugin/cross中找到的某些胶水对准NPAPI

当然,zlib例如使用z_stream通过函数inflateInit,inflate,deflateInit,deflate进行增量压缩和解压缩。 libzip2有类似的能力。

对于从存档中增量提取(当它被放气时),看看例如到旧的tar格式。

退房boost::zlib filters。他们使用zlib

下面是从升压文档,将解压缩文件并将其写入到控制台样本:

#include <fstream> 
#include <iostream> 
#include <boost/iostreams/filtering_streambuf.hpp> 
#include <boost/iostreams/copy.hpp> 
#include <boost/iostreams/filter/zlib.hpp> 

int main() 
{ 
    using namespace std; 

    ifstream file("hello.z", ios_base::in | ios_base::binary); 
    filtering_streambuf<input> in; 
    in.push(zlib_decompressor()); 
    in.push(file); 
    boost::iostreams::copy(in, cout); 
}