디렉토리의 타르볼을 만든 다음 C++에서 bz2로 압축해야합니다. 거기에 libtar 및 libbz2 사용에 대한 괜찮은 자습서가 있습니까?C++에서 libbz2를 사용하여 디렉토리를 압축하는 방법
10
A
답변
1
"어떻게 이럴 수 있습니까?"라는 질문이 아니라고 가정하면 명백한 방법은 GNU tar를 포크로 실행하여 수행하는 것입니다. 가장 쉬운 방법은 시스템 (3) 라이브러리 루틴이다 :
system("/path/to/gtar cfj tarballname.tar.bz2 dirname");
는 this에 따르면, libtar의 disty의 예제 프로그램이 있습니다.
Bzip의 설명서에는 programming with libbz2 섹션이 있습니다.
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;
}
왜 명백한 방법입니까? 그가이 일을 많이한다면 프로세스 오버 헤드가 커질 것입니다. 이런 식으로 그는 bzip의 옵션을 완전히 제어 할 수 있습니다. 물론, 시스템을 호출 할 때 인수를 올바르게 이스케이프 처리하는 것이 가장 좋습니다. –
은 간단하기 때문에 필요한 작업을 수행하며 tar 형식 등의 세부 사항에 전혀 영향을받지 않습니다. UNIX 시스템에서 적어도 fork/exec는 비교적 저렴합니다. 그래서, "일할 수있는 가장 단순한 것은 무엇입니까?"라는 의미에서의 "명백한"것인가? –
libbz2에 대한 요청이었습니다. fork/exec를 통해 tar/bzip2를 호출하지 않아서 작업을 완료했습니다. – hd1