我有这个代码,我在stackoverflow上找到了一个使用libtar和libbz2来压缩目录的代码:
#include <libtar.h>
#include <bzlib.h>
#include <fcntl.h>
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char **argv) {
TAR *p_tar;
char extract_to[] = ".";
char *dst_path = argv[2];
char *src_path = argv[1];
tar_open(&p_tar,dst_path,NULL,O_WRONLY | O_CREAT,0644,TAR_GNU);
tar_append_tree(p_tar,src_path,extract_to);
close(tar_fd(p_tar));
int tar_fd = open(dst_path,O_RDONLY);
string bz2_file_name = dst_path;
bz2_file_name.append(".bz2");
FILE *bz2_file = fopen(bz2_file_name.data(),"wb");
int bz2_err;
const int BLOCK_MULTIPLIER = 7;
BZFILE *pbz = BZ2_bzWriteOpen(&bz2_err,bz2_file,BLOCK_MULTIPLIER,0,0);
const int BUF_SIZE = 10000;
char* buffer = new char[BUF_SIZE];
size_t bytes_read;
while((bytes_read=read(tar_fd,buffer,BUF_SIZE))>0)
{
BZ2_bzWrite(&bz2_err,pbz,buffer,bytes_read);
}
BZ2_bzWriteClose(&bz2_err,pbz,0,NULL,NULL);
close(tar_fd);
remove(dst_path);
return 0;
}
虽然它创建了一个bz2文件并且它的大小似乎是正确的(从5MB目录开始是1,7 MB),但是存档本身已损坏,我无法使用ark或命令行tar打开它。有什么问题?
答案 0 :(得分:2)
tar和bz2是这个过程的不同步骤。 Tar将一堆文件连接成一个带索引的文件,然后bzip2压缩该单个文件。
要手动提取,请按相反顺序进行。在unix / linux系统上:
bunzip2 file.tar.bz2
应该给你一个.tar文件,然后你可以
tar -xvf file.tar
从tar文件中提取内容(也称为tarball)。
答案 1 :(得分:0)
tar xjf thefile.tar.bz2
适用于现代tar
实施,例如gnu's。