2009-05-01 4 views

답변

1

"어떻게 이럴 수 있습니까?"라는 질문이 아니라고 가정하면 명백한 방법은 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에 대한 요청이었습니다. fork/exec를 통해 tar/bzip2를 호출하지 않아서 작업을 완료했습니다. – hd1

15

좋아, 나는 당신을 위해 간단한 예제를 만들었습니다. 오류 검사 및 다양한 임의적 결정은 없지만 작동합니다. libbzip2는 상당히 good web documentation입니다. libtar는 아니지만 패키지에는 맨 페이지, 예제 및 문서화 된 헤더 파일이 있습니다. 아래는 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; 

} 
관련 문제