从流式存档即时解压缩和提取文件
我正在编写一个浏览器插件,类似于Flash和Java,因此它一开始显示就开始下载文件(.jar或.swf)。 Java等待(我相信),直到整个jar文件被加载,但Flash不。我需要相同的功能,但是需要压缩的存档文件。只要下载解压缩所需的字节,我想立即访问存档中的文件。从流式存档即时解压缩和提取文件
例如,我正在将档案下载到内存缓冲区中,只要第一个文件可以解压缩,我想能够解压缩它(也存储到内存缓冲区)。
是否有任何格式/库支持?
编辑:如果可能,我更喜欢单个文件格式,而不是单独的压缩和存档格式,如gz/bzip2和tar。
这里有
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
退房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);
}
您找到了什么解决方案? – 2016-02-23 01:58:24