【问题标题】:Can I create a multi-file zip archive from memory buffer using Poco?我可以使用 Poco 从内存缓冲区创建多文件 zip 存档吗?
【发布时间】:2012-07-23 10:18:20
【问题描述】:

我正在考虑将我的项目转移到 Poco。我想先把一些代码移过来,看看 Poco 的样子和能力。

我需要做的一件事是将多个内存缓冲区作为多文件 zip 存档写入磁盘。即 char buffer[] -> DEFLATE Zip 存档。没有中间文件写入磁盘。

目前我使用 zlib 来实现这一点。我也对http://libarchive.github.com/ 做了同样的事情。

我可以在 Poco 中执行此操作吗?

我查看了示例,似乎它只将文件名作为输入,而不是指向缓冲区的 (char *) 指针。

http://pocoproject.org/docs/ZipUserGuide.html

【问题讨论】:

    标签: c++ zip poco-libraries


    【解决方案1】:

    是的,您可以使用 POCO 将原始内存缓冲区添加到 zip 文件中。

    以下运行代码显示了如何借助零拷贝Poco::MemoryInputStream。您可以对std::istringstream 执行相同的操作,但在这种情况下,您将拥有从缓冲区到底层std::stringbuf 的内存副本。

    #include <Poco/Exception.h>
    #include <Poco/Zip/Compress.h>
    #include <Poco/DateTime.h>
    #include <Poco/MemoryStream.h>
    
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    /*
     * Compress multiple buffers to a zip archive, each buffer gets its filename.
     * Raw data, you need to do the serialization yourself.
     * To verify the data: unzip data.zip && hexdump -C buf1 && hexdump -C buf2
     */
    void f(const char* buf1, size_t buf1len, const char* buf2, size_t buf2len) {
        std::ofstream ostr("data.zip", std::ios::binary);
        Poco::Zip::Compress compress(ostr, true);
    
        // Poco::MemoryInputStream is a zero-copy implementation of std::istream :-)
        Poco::MemoryInputStream mis1(buf1, buf1len);
        compress.addFile(mis1, Poco::DateTime(), "buf1");
    
        Poco::MemoryInputStream mis2(buf2, buf2len);
        compress.addFile(mis2, Poco::DateTime(), "buf2");
    
        compress.close();
        ostr.close();
    }
    
    int main() {
        const char buf1[] = "binary\0buffer"; size_t buf1len = sizeof(buf1);
        const char buf2[] = "BIN\0BUF";       size_t buf2len = sizeof(buf2);
        try {
            f(buf1, buf1len, buf2, buf2len);
            return 0;
        } catch (Poco::Exception& e) {
            cout << e.displayText() << endl;
            return -1;
        }
    }
    

    在我看来,POCO 是一个很棒的、轻量级的、现代的、易于理解的 C++ 库,你会很快发现自己对它很放心。

    【讨论】:

    • 可惜没有中间文件无法解压
    • 是否有任何选项可以将更多数据添加到“mis1”流中。说你可以分块数据,是否可以分块压缩它?
    【解决方案2】:

    是的,您当然可以将文件添加到 zip 中,而无需实际文件。虽然您不能直接传递char *,但有一个addFile() 接受std::istream,从中读取数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多