如何在C++中使用libbz2压缩目录

10 c++ compression tar bzip2

我需要创建一个目录的tarball,然后用C++中的bz2压缩它.有没有关于使用libtar和libbz2的体面教程?

Mat*_*hen 15

好的,我为你做了一个快速的例子.没有错误检查和各种任意决定,但它的工作原理.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;

}
Run Code Online (Sandbox Code Playgroud)


Cha*_*tin 1

假设这不仅仅是一个“我怎样才能做到这一点”的问题,那么显而易见的方法是 fork/exec GNU tar 来为您做到这一点。最简单的方法是使用system(3)库例程:

  system("/path/to/gtar cfj tarballname.tar.bz2 dirname");
Run Code Online (Sandbox Code Playgroud)

据此 libtar disty中有示例程序。

Bzip 的文档包括有关使用 libbz2 进行编程的部分。