我需要在C++中创建一个目录的tarball,并使用bz2进行压缩。有没有关于如何使用libtar和libbz2的不错教程?
我需要在C++中创建一个目录的tarball,并使用bz2进行压缩。有没有关于如何使用libtar和libbz2的不错教程?
好的,我为您准备了一个快速示例。没有错误检查和各种任意决策,但它可以工作。libbzip2有相当不错的网络文档。libtar则没有那么多,但是软件包中有man页面、示例和已记录的头文件。下面的代码可以使用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;
}
假设这不仅仅是一个“我该如何做到这一点”的问题,那么显而易见的方法是分叉/执行GNU tar来为您完成。最简单的方法是使用system(3)库例程:
system("/path/to/gtar cfj tarballname.tar.bz2 dirname");
(cd ~; ls)
做了什么?它forks三次并执行两个exec。整个“system是邪恶的”事情每隔一段时间就会出现,因为又有一代业余爱好者开始认为他们比Ken Thompson聪明。 - Charlie Martin