3

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

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

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

我可以在 Poco 中做到这一点吗?

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

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

4

2 回答 2

3

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

以下运行代码显示了如何在零拷贝的帮助下Poco::MemoryInputStream。您可以std::istringstreamstd::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++ 库,你很快就会发现自己对它很放心。

于 2012-07-25T20:47:54.267 回答
0

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

于 2012-07-23T12:37:28.323 回答