Использование libtar для сжатия каталога - PullRequest
0 голосов
/ 06 июня 2009

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

Ответы [ 2 ]

2 голосов
/ 06 июня 2009

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

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

bunzip2 file.tar.bz2

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

tar -xvf file.tar

для извлечения вещей из файла tar (также называемого tarball).

0 голосов
/ 06 июня 2009

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

...