zip 파일 포맷 구조상으로 기존 zip 파일에서 특정 파일을 지우는 과정인 많은 연산이 필요합니다. 이러한 이유로 특정 파일을 삭제하는 명령어를 권장하지 않습니다.
따라서 zip 파일에서 특정 파일을 지우는 과정은 새로 zip 파일을 생성하고, 지울 필요가 없는 파일만 복사해줍니다. 새로운 zip 파일을 만들고 복사하는 과정에서, 이미 기존 zip 파일이 zlib의 알고리즘으로 압축된 상태임으로 데이터만 그대로 복사해줄 필요가 있습니다.
unzOpenCurrentFile2 함수를 사용해서 압축된 데이터의 압축된 데이터를 얻어낼 수 있습니다. zipOpenNewFileInZip2 함수를 사용해서 압축 연산을 사용하지 않고 입력된 데이터 그래도 zip 파일에 넣어줄 수 있습니다. zipCloseFileInZipRaw 함수는 zipOpenNewFileInZip2 함수의 마지막 인자인 raw가 1인 경우에 zipCloseFileInZip 파일 대신 사용해야 합니다.
DelZip.cpp 파일
// DelZip.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <LibZ/unzip.h>
#include <LibZ/zip.h>
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
unzFile uf = unzOpen("test.zip");
int ret = unzGoToFirstFile(uf);
if( UNZ_OK!= ret) {
unzClose(uf);
return 0;
}
unz_file_info uinfo;
const int MAX_PATH = 256;
char filename[MAX_PATH];
int method(0), level(0);
const int BUF = 1024;
char in[BUF];
int readsize(0);
zipFile zf = zipOpen("test_back.zip",APPEND_STATUS_CREATE);
do{
unzGetCurrentFileInfo(uf,&uinfo,filename, MAX_PATH,NULL,0, NULL,0);
if( 0==strcmp ( filename,"del.txt") ) continue;
unzOpenCurrentFile2(uf,&method, &level,1);
zipOpenNewFileInZip2(zf,filename,NULL,NULL,0, NULL,0,NULL,method,level,1);
int tsize = uinfo.compressed_size;
do{
readsize = unzReadCurrentFile(uf, in, BUF);
tsize -= readsize;
zipWriteInFileInZip(zf,in, readsize);
} while( 0!=tsize);
zipCloseFileInZipRaw(zf,uinfo.uncompressed_size,uinfo.crc);
unzCloseCurrentFile(uf);
} while( UNZ_OK == unzGoToNextFile(uf) );
zipClose(zf, NULL);
unzClose(uf);
return 0;
}
thanks you very!
안녕하세요 좋은 영상과 글을 잘 봤습니다.
글에 보면 “입력 버퍼와 출력 버퍼를 고정으로한 압축 함수”에 대해서 어떤 함수를 봐야 하는지 알수 있을까요?
좋은 글 감사드리며, 오래된 글에 문의를 남깁니다.
감사합니다.
[compress,uncompress 함수 사용하기] 동영상입니다.
동영상 잘 보았습니다. 궁금한것이 있는데요, Z_SYNC_FLUSH 를 사용할 경우에, 만약 next_out buffer 크기가 압축한 data 를 담기에 충분하지 않는다면, 어떻게 해야 하는지요?
Z_SYNC_FLUSH는 쓰고 있는 비트를 모두 바이트 단위로 쓰라는 옵션임으로 일반적인 쓰기 과정에서 발생한 에러 코드를 반환하게 되어 있습니다. [Deflate 샘플] 동영상을 참고하세요.
C로 압축하고 c#으로 압축을 푸는 방법이 있을까요?
텍스트 파일을 작성시
gzwritre(파일 포인터, 2019, sizeof(int));
gzwritre(파일 포인터, 09, sizeof(int));
gzwritre(파일 포인터, 17, sizeof(int));
gzwritre(파일 포인터, 0.1, sizeof(float)); 결과값
gzwritre(파일 포인터, 0.2, sizeof(float));
gzwritre(파일 포인터, 0.3, sizeof(float));
…
gzwritre(파일 포인터, 100.0, sizeof(float));
이렇게 텍스트 파일을 저장(압축)했는데 C#에서 이 파일을 읽어서
연 / 월 / 일 을 정수 변수에
결과값을 실수배열에 저장하고 싶습니다.
C#으로 포팅된 zip라이브러리를 사용하시면 문제없이 될겁니다. 예를 들어 SharpZipLib과 같은~
http://icsharpcode.github.io/SharpZipLib/
https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples
https://icsharpcode.github.io/SharpZipLib/help/api/ICSharpCode.SharpZipLib.GZip.GZip.html
분할 압축파일일 경우 zilb로 압축 해제가 가능 한가요?
아니면 다른 라이브러리를 사용해야 할까요 ?
별도로 지원하는 함수는 없지만 그냥 저장하는 과정에서 파일만 나눠 저장하는 것이 아닐지요.
안녕하세요
c++에서 zlib uncompress로 .emf image 파일을 압축해제 하려고 합니다.
그런데 손상된 파일이을 대상으로 진행할 경우 Z_DATA_ERROR을 반환하면서 자동종료됩니다.
압축된 파일이 Z_DATA_ERROR를 반환하면(손상된 파일이면) 빈 .emf image 파일로 압축해제 되도록 하려면 어떻게 해야할까요?
Z_DATA_ERROR이면 그냥 빈.emf image 파일을 생성해주면 되는 것 아닌가요?
리눅스에서 C언어를 사용해서 zlib으로 위와 같이 폴더(디렉토리)를 압축할수있나요?
libzip에 포함된 contrib/minizip를 함께 사용하시면 가능합니다.