2009-05-01 5 views

ответ

1

Предполагая, что это не просто вопрос «как я могу это сделать», то очевидным способом является fork/exec GNU tar, чтобы сделать это за вас. Самый простой способ с системы (3) обычной библиотеки:

system("/path/to/gtar cfj tarballname.tar.bz2 dirname"); 

Согласно this, есть примеры программ в libtar DISTY.

Документация Bzip содержит раздел о programming with libbz2.

+1

Почему это очевидно? Если он делает это много, накладные расходы процесса станут значительными. Не говоря уже о том, что таким образом он полностью контролирует варианты bzip. И, конечно, лучше всего убедиться, что вы правильно избегаете аргументов при вызове системы. –

+1

, потому что это просто, он делает все, что нужно, и он абсолютно нечувствителен к каким-либо небольшим деталям формата tar и т. Д. На машине UNIX, по крайней мере, fork/exec является * относительно * дешевым. Итак, «очевидно» в смысле «что такое простейшая вещь, которая может работать?» –

+0

Запрос был для libbz2, не вызывающий tar/bzip2 через fork/exec для выполнения задачи. – hd1

15

Хорошо, я подготовил для вас быстрый пример. Нет проверки ошибок и различных произвольных решений, но она работает. libbzip2 имеет довольно good web documentation. libtar, не так много, но есть manpages в пакете, пример и документированный заголовочный файл. Нижеследующее может быть построено с помощью 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; 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^