10

ディレクトリの tarball を作成し、C++ の bz2 で圧縮する必要があります。libtar と libbz2 の使用に関する適切なチュートリアルはありますか?

4

2 に答える 2

14

さて、私はあなたのために簡単な例を作りました。エラーチェックやさまざまな任意の決定はありませんが、機能します。libbzip2にはかなり優れたWebドキュメントがあります。libtarはそれほど多くはありませんが、パッケージにはマンページ、例、および文書化されたヘッダーファイルがあります。以下はで構築することができますg++ C++TarBz2.cpp -ltar -lbz2 -o C++TarBz2.exe

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <libtar.h>
#include <bzlib.h>
#include <unistd.h>

int main()
{
    TAR *pTar;
    char tarFilename[] = "file.tar";
    char srcDir[] = "dirToZip/";
    char extractTo[] = ".";
    
    tar_open(&pTar, tarFilename, NULL, O_WRONLY | O_CREAT, 0644, TAR_GNU);
    tar_append_tree(pTar, srcDir, extractTo);
    
    close(tar_fd(pTar));

    int tarFD = open(tarFilename, O_RDONLY);

    char tbz2Filename[] =  "file.tar.bz2";
    FILE *tbz2File = fopen(tbz2Filename, "wb");
    int bzError;
    const int BLOCK_MULTIPLIER = 7;
    BZFILE *pBz = BZ2_bzWriteOpen(&bzError, tbz2File, BLOCK_MULTIPLIER, 0, 0);
   
    const int BUF_SIZE = 10000;
    char* buf = new char[BUF_SIZE];
    ssize_t bytesRead;
    while((bytesRead = read(tarFD, buf, BUF_SIZE)) > 0) {
        BZ2_bzWrite(&bzError, pBz, buf, bytesRead);
    }        
    BZ2_bzWriteClose(&bzError, pBz, 0, NULL, NULL);
    close(tarFD);
    remove(tarFilename);

    delete[] buf;

}
于 2009-05-01T22:33:35.397 に答える
1

これが単なる「これを行うにはどうすればよいか」という質問ではないと仮定すると、明らかな方法は、GNU tar を fork/exec してそれを行うことです。最も簡単な方法は、system(3)ライブラリ ルーチンを使用することです。

  system("/path/to/gtar cfj tarballname.tar.bz2 dirname");

thisによるとlibtar disty にサンプルプログラムがあります。

Bzip のドキュメントには、libbz2 を使用したプログラミングに関するセクションが含まれています。

于 2009-05-01T22:06:45.447 に答える