2009-05-01 6 views

Antwort

1

Angenommen, dies ist nicht nur eine Frage "Wie kann ich das tun?", Dann ist der naheliegende Weg, GNU tar zu forcieren, um es für Sie zu tun. Der einfachste Weg ist mit der System (3) Bibliotheksroutine:

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

Nach this gibt es Beispielprogramme in der libtar disty sind.

Die Dokumentation von Bzip enthält einen Abschnitt zu programming with libbz2.

+1

Warum ist das der offensichtliche Weg? Wenn er das viel tut, wird der Prozess-Overhead signifikant werden. Ganz zu schweigen davon, dass er auf diese Weise die volle Kontrolle über die Möglichkeiten von bzip hat. Und natürlich sollten Sie sicherstellen, dass Sie Argumente beim Aufruf des Systems korrekt umgehen. –

+1

weil es einfach ist, tut es, was benötigt wird, und es ist völlig unempfindlich gegenüber irgendwelchen kleinen Details des tar-Formats usw. Auf einem UNIX-Rechner ist zumindest fork/exec * relativ * billig. Also "offensichtlich" im Sinne von "Was ist die einfachste Sache, die funktionieren könnte?" –

+0

Die Anfrage war für libbz2, nicht Aufruf von tar/bzip2 über fork/exec, um die Aufgabe zu erfüllen. – hd1

15

Okay, ich habe ein schnelles Beispiel für Sie ausgearbeitet. Keine Fehlerprüfung und verschiedene willkürliche Entscheidungen, aber es funktioniert. libbzip2 hat ziemlich good web documentation. Libtar, nicht so sehr, aber es gibt Manpages im Paket, ein Beispiel und eine dokumentierte Header-Datei. Die folgenden können mit g++ C++TarBz2.cpp -ltar -lbz2 -o C++TarBz2.exe gebaut werden:

#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; 

} 
Verwandte Themen