2009-07-21 126 views
6

我正在編寫一個瀏覽器插件,類似於Flash和Java,因此它一開始顯示就開始下載文件(.jar或.swf)。 Java等待(我相信),直到整個jar文件被加載,但Flash不。我需要相同的功能,但是需要壓縮的存檔文件。只要下載解壓縮所需的字節,我想立即訪問存檔中的文件。從流式存檔即時解壓縮和提取文件

例如,我正在將檔案下載到內存緩衝區中,只要第一個文件可以解壓縮,我想能夠解壓縮它(也存儲到內存緩衝區)。

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

編輯:如果可能,我更喜歡單個文件格式,而不是單獨的壓縮和存檔格式,如gz/bzip2和tar。

+0

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

回答

6

這裏有

  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

2

當然,zlib例如使用z_stream通過函數inflateInit,inflate,deflateInit,deflate進行增量壓縮和解壓縮。 libzip2有類似的能力。

對於從存檔中增量提取(當它被放氣時),看看例如到舊的tar格式。

5

退房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); 
}