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;
}