我可以使用Poco从内存缓冲区创建多文件zip存档吗?

时间:2012-07-23 10:18:20

标签: c++ zip poco-libraries

我正在考虑将我的项目转移到Poco。我想首先将一些代码移到看看Poco是什么样子和能力的。

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

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

我可以在Poco中这样做吗?

我查看了这些示例,看起来它只需要一个文件名作为输入,而不是指向缓冲区的(char *)指针。

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

2 个答案:

答案 0 :(得分:3)

是的,您可以使用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 ++库,你会发现自己很快就可以轻松使用它。

答案 1 :(得分:0)

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