2009-06-05 3 views
0

У меня есть этот код, который я нашел где-то на StackOverflow, который использует libtar и libbz2 для сжатия каталога:Использование libtar для сжатия директории

#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 и его размер, похоже, прав (1,7 МБ из каталога 5 МБ), но сам архив поврежден, я не могу открыть его ни с помощью ark, ни с командной строки tar. В чем проблема?

ответ

2

tar и bz2 - это разные этапы процесса, если хотите. Tar объединяет кучу файлов вместе в один файл с индексом, а затем bzip2 сжимает этот единственный файл.

Чтобы извлечь вручную, действуйте в обратном порядке. В системе UNIX/Linux:

bunzip2 file.tar.bz2

должен дать вам файл .tar, то вы можете

TAR -xvf file.tar

извлечь вещи из tar-файл (также называемый tarball).

+0

Он не пытается это сделать в командной строке - он пытается сделать это программно. –

+0

Его проблема заключалась в том, как он пытался открыть архив, чтобы проверить его, а не в его создании архива. –

0

tar xjf thefile.tar.bz2 работает с современными tar реализациями, такими как gnu's.