2016-08-22 2 views
0

나는 우편 번호 아카이브 개의 파일을 작성하기 위해 Java의 표준 라이브러리를 사용하고 있으며이 경우에는 저장할 파일을 알 필요가 없습니다. zip 파일을 미리 작성하십시오. 간단히 새로운 ZipEntry를 작성한 다음 ZipFile 스트림에 작성합니다.초기 파일 크기를 모르는 상태에서 C++로 압축 파일 만들기

반면에 LibArchive와 C++ 용 ZLib는 미리 보관할 파일 정보를 설정해야합니다 : 제 경우에는 압축하려는 데이터가 extern 스트림에서 나오므로 크기를 쿼리 할 수 ​​없습니다 스트림 자체의 초기 파일 정보가 필요하지 않도록 해당 라이브러리를 사용하는 라이브러리/방법이 있습니까?

EDIT 또한 LibArchive의 다음 C++ 코드는 데이터가없는 파일을 포함하는 유효한 ZIP 파일을 생성합니다.

a = archive_write_new(); 
    archive_write_add_filter_gzip(a); 
    archive_write_set_format_pax_restricted(a); 
    archive_write_open_filename(a, path.c_str()); 
    entry = archive_entry_new(); // Note 2 
    archive_entry_set_pathname(entry, entryName.c_str()); 
    archive_entry_set_perm(entry, 0666); 
    archive_write_header(a, entry); 
    size_t s = archive_write_data(a, buff, len); 
    archive_entry_free(entry); 
    archive_write_close(a); 
    archive_write_free(a); 
+0

권장 사항을 찾는 것이 빠르게 남쪽으로 이동합니다. DOS에 관한 [help] (http://stackoverflow.com/help) 섹션을 참고하십시오. 그리고 Java와 libs에 대한 언급은 C++ 관련 질문에 아무런 의미가 없습니다. –

+0

이것은 매우 stackexchange 커뮤니티의 전형적인 문제입니다 ... – jackb

+0

아니. 우리 모두는 그 일을 겪었습니다. 내가 초보 사용자 일 때도 나에게 일어났다. 일단 당신이 SO 방법을 배우면 그것은 산들 바람입니다. –

답변

3

공식 Zlib site에서 샘플을 확인하십시오. 원본 파일의 샘플 바이트가 소스의 EOF까지 새 파일로 압축됩니다. 소스 파일의 파일 크기가 사용되지 않습니다.

strm.avail_in = fread(in, 1, CHUNK, source); 

in 버퍼를 채우기 위해 스트림로부터 바이트를 얻을 수 있도록 기능을 사용하면 사용자 정의 스트림을 사용하는 샘플에서 변경해야

유일한 것은이 라인입니다.

Zlib에서 ZIP 보관을 처리하려면 contrib/minizip을 사용하십시오. Here은 그것을 사용하는 방법에 대한 토론입니다.

+0

감사합니다.그건 그렇고, 이런 식으로 시간당 하나의 파일 만 압축하고 ZIP 아카이브는 수행하지 않습니다. ZIP 아카이브에 대해 동일한 작업을 수행 할 수 있습니까? – jackb

+1

@jackb Zlib 자체는 ZIP 아카이브를 처리 할 수 ​​없지만 [contrib \ minizip] (https://github.com/madler/zlib/tree/master/contrib/minizip)에는 확장이 있습니다. – Nikita

+0

고마워, 나는 그걸 확인하려고 노력할 것이다. Zip 아카이브를 언급하고 있음을 명확히하는 질문을 편집합니다. – jackb