zip 파일에서 특정 파일만 지우기


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

 

 

- 목록:

13 thoughts on “gz 파일 사용하기

  1. 안녕하세요 좋은 영상과 글을 잘 봤습니다.
    글에 보면 “입력 버퍼와 출력 버퍼를 고정으로한 압축 함수”에 대해서 어떤 함수를 봐야 하는지 알수 있을까요?
    좋은 글 감사드리며, 오래된 글에 문의를 남깁니다.
    감사합니다.

  2. 동영상 잘 보았습니다. 궁금한것이 있는데요, Z_SYNC_FLUSH 를 사용할 경우에, 만약 next_out buffer 크기가 압축한 data 를 담기에 충분하지 않는다면, 어떻게 해야 하는지요?

    • Z_SYNC_FLUSH는 쓰고 있는 비트를 모두 바이트 단위로 쓰라는 옵션임으로 일반적인 쓰기 과정에서 발생한 에러 코드를 반환하게 되어 있습니다. [Deflate 샘플] 동영상을 참고하세요.

  3. 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#에서 이 파일을 읽어서

    연 / 월 / 일 을 정수 변수에
    결과값을 실수배열에 저장하고 싶습니다.

  4. 분할 압축파일일 경우 zilb로 압축 해제가 가능 한가요?
    아니면 다른 라이브러리를 사용해야 할까요 ?

    • 별도로 지원하는 함수는 없지만 그냥 저장하는 과정에서 파일만 나눠 저장하는 것이 아닐지요.

  5. 안녕하세요
    c++에서 zlib uncompress로 .emf image 파일을 압축해제 하려고 합니다.
    그런데 손상된 파일이을 대상으로 진행할 경우 Z_DATA_ERROR을 반환하면서 자동종료됩니다.
    압축된 파일이 Z_DATA_ERROR를 반환하면(손상된 파일이면) 빈 .emf image 파일로 압축해제 되도록 하려면 어떻게 해야할까요?

  6. 리눅스에서 C언어를 사용해서 zlib으로 위와 같이 폴더(디렉토리)를 압축할수있나요?

Leave a Reply to rust Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>