2009-05-01 9 views

risposta

1

Supponendo che questa non sia solo una domanda "come posso fare", allora il modo ovvio è quello di fork/exec GNU tar di farlo per voi. Il modo più semplice è con il sistema (3) routine di libreria:

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

Secondo this, ci sono esempi di programmi nella disty libtar.

La documentazione di Bzip include una sezione su programming with libbz2.

+1

Perché è così ovvio? Se lo fa molto, il sovraccarico del processo diventerà significativo. Per non parlare del fatto che in questo modo ha il pieno controllo sulle opzioni di bzip. E, naturalmente, è meglio assicurarsi di sfuggire gli argomenti correttamente quando si chiama il sistema. –

+1

perché è semplice, fa ciò che è necessario ed è completamente insensibile a qualsiasi piccolo dettaglio del formato tar ecc. Su una macchina UNIX, almeno, fork/exec è * relativamente * economico. Quindi, "ovvio" nel senso di "qual è la cosa più semplice che potrebbe funzionare?" –

+0

La richiesta era per libbz2, non chiamando tar/bzip2 tramite fork/exec per eseguire l'operazione. – hd1

15

OK, ho elaborato un rapido esempio per te. Nessun errore di controllo e varie decisioni arbitrarie, ma funziona. libbzip2 ha abbastanza good web documentation. libtar, non così tanto, ma ci sono manpage nel pacchetto, un esempio e un file di intestazione documentato. Il sottostante può essere costruito con 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; 

} 
Problemi correlati