3

プロジェクトを Poco に移行することを考えています。コードの一部を移動して、Poco がどのような機能を持っているかを確認することから始めたいと思います。

私がしなければならないことの 1 つは、複数のメモリ バッファーを複数ファイルの zip アーカイブとしてディスクに書き込むことです。つまり、char buffer[] -> DEFLATE Zip アーカイブ。中間ファイルはディスクに書き込まれません。

現在、これを実現するために zlib を使用しています。http://libarchive.github.com/でも同じことをしました。

Pocoでこれを行うことはできますか?

例を見てきましたが、バッファへの (char *) ポインタではなく、ファイル名のみを入力として使用しているようです。

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

4

2 に答える 2

3

はい、 POCOを使用して生メモリ バッファを zip ファイルに追加できます。

次の実行中のコードは、 zero-copy の助けを借りて、その方法を示しています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++ ライブラリです。すぐに使いこなせるようになるでしょう。

于 2012-07-25T20:47:54.267 に答える
0

はい、実際のファイルがなくても、ファイルを zip に追加できます。char *を直接渡すことはできませんがaddFile()std::istreamデータを読み取るために を受け取る があります。

于 2012-07-23T12:37:28.323 に答える