代码之家  ›  专栏  ›  技术社区  ›  Jon Cage

实时从流媒体存档中解压缩和提取文件

  •  6
  • Jon Cage  · 技术社区  · 17 年前

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

    3 回复  |  直到 17 年前
        1
  •  6
  •   gman    12 年前

    这里有两个问题

    1. 如何编写代码。

    2. 使用什么格式。

    在文件格式上,您不能使用。ZIP格式是因为。ZIP将目录放在文件的末尾。这意味着你必须下载整个文件才能知道里面有什么。Zip有你可以扫描的标题,但这些标题不是文件中内容的官方列表。

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

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

    这种附加功能是zip的明确设计目标。它来自20世纪80年代,当时一个zip可以跨越多张软盘。如果你需要添加一个文件,仅仅为了重写整个zip文件就必须读取所有N张光盘,这会很糟糕。因此,该格式只允许您将更新的文件附加到末尾,这意味着它只需要最后一张光盘。它只是读取旧的TOC,附加新文件,写入新的TOC。

    Gzip压缩的tar文件没有这个问题。Tar文件存储在头、文件、头文件中,压缩是在其之上的,因此可以在下载文件时解压缩,并在文件可用时使用这些文件。您可以在windows中使用winrar(商业)或7-zip(免费)轻松创建gzip压缩的tar文件,在linux、osx和cygwin上使用tar命令。

    关于要编写的代码,

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

    解压缩代码位于o3d/import/cross/中。..

        2
  •  5
  •   Matt Price    17 年前

    看看 boost::zlib filters 他们利用 zlib 啪的一声。

    以下是boost文档中的示例,它将解压缩文件并将其写入控制台:

    #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);
    }
    
        3
  •  2
  •   Alex Martelli    17 年前

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

    对于从存档中增量提取(当它收缩时),请查看例如旧的 tar