디렉토리의 타르볼을 만든 다음 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;
}
관련 문제
- 1. 특정 디렉토리를 루트로 사용하여 디렉토리를 압축하는 명령
- 2. .NET을 사용하여 디렉토리를 압축하는 방법은 무엇입니까?
- 3. 내장 된 압축 클래스를 사용하여 디렉토리를 압축하는 방법은 무엇입니까?
- 4. gzip을 사용하여 .net 객체 인스턴스를 압축하는 방법
- 5. JAR 유틸리티를 사용하여 .par 파일을 압축하는 방법
- 6. 리눅스에서 이미지를 압축하는 방법?
- 7. nerdtree를 사용하여 디렉토리를 만드는 방법
- 8. Silverlight에서 음성 스트림을 압축하는 방법
- 9. mysql을 사용하여 perl dbi를 사용하여 데이터를 압축하는 방법
- 10. C에서 파일 목록에서 디렉토리를 제거해야 함
- 11. MS Access 데이터베이스를 압축하는 방법
- 12. PHP 파일을 안전하게 압축하는 방법
- 13. 문자열의 크기를 결정하고 압축하는 방법
- 14. Ant를 사용하여 .jar 파일로 디렉토리를 변환하는 방법
- 15. ActionScript를 사용하여 "% systemroot %"디렉토리를 얻는 방법
- 16. .htaccess ..를 사용하여 URL에서 디렉토리를 제거하는 방법
- 17. 자바 스크립트를 압축하는 Makefile
- 18. 업로드 기술을 사용하여 jpeg를 압축하는 방법이 있습니까?
- 19. PKZIP을 사용하여 파일을 압축하는 C# .net 코드
- 20. 아카이브 개별 하위 폴더를 압축하는 방법
- 21. TYPO3에서 js/css 파일을 압축하는 방법
- 22. android에서 이미지 뷰어로 이미지를 압축하는 방법
- 23. iphone 오디오 파일 크기를 압축하는 방법
- 24. C#에서 Object [] []를 압축하는 방법
- 25. iphone : objective-c : NSString을 압축하는 방법?
- 26. PHP를 통해 exec 명령 줄로 압축하는 방법
- 27. PHP에서 대용량 파일을 빠르게 압축하는 방법
- 28. json을 반환하는 편안한 wcf 서비스에서 압축하는 방법
- 29. numpy 배열 (파이썬)을 압축하는 효율적인 방법
- 30. PHP에서 디렉토리를 만드는 방법
왜 명백한 방법입니까? 그가이 일을 많이한다면 프로세스 오버 헤드가 커질 것입니다. 이런 식으로 그는 bzip의 옵션을 완전히 제어 할 수 있습니다. 물론, 시스템을 호출 할 때 인수를 올바르게 이스케이프 처리하는 것이 가장 좋습니다. –
은 간단하기 때문에 필요한 작업을 수행하며 tar 형식 등의 세부 사항에 전혀 영향을받지 않습니다. UNIX 시스템에서 적어도 fork/exec는 비교적 저렴합니다. 그래서, "일할 수있는 가장 단순한 것은 무엇입니까?"라는 의미에서의 "명백한"것인가? –
libbz2에 대한 요청이었습니다. fork/exec를 통해 tar/bzip2를 호출하지 않아서 작업을 완료했습니다. – hd1