gz 파일 사용하기


zlib 라이브러리에는 Gnu Zip 파일 제어 함수가 포함되어 있습니다. gz 파일은 마치 파일 IO 제어 함수와 아주 유사한 API를 지원합니다. gz 파일은 아카이브 파일이 아닙니다. 아카이브 파일은 한개의 파일에 다수의 파일을 결합해둔 파일 포맷을 의미합니다. 대표적으로 zip 파일인 아키이브 파입니다. gz 파일은 오직 한개의 파일만 압축할 수 있습니다. 대신 gz 파일은 마치 일반적인 파일을 제어하는 것과 유사합니다.

한개의 파일을 파일 제어하듯 사용하고 싶다면 gz 파일 포맷도 좋은 선택이 될 수 있습니다.

gzTest.cpp 파일
// gzTest.cpp : Defines the entry point for the console application.
//

#include  "stdafx.h"
#include  <LibZ/zlib.h>
#include  <fstream>

void makegz(const  char* filename, const  char* otherfilename);
void readgz(const  char* filename, const  char* otherfilename);

void cmakegz(const  char* filename, const  char* data);

int  _tmain(int  argc, _TCHAR* argv[])
{
    makegz("ReadMe.txt.gz", "ReadMe.txt");
    readgz("ReadMe.txt.gz", "result.txt");
    cmakegz("test.txt.gz","Hello");
   return 0;
}

void cmakegz(const  char* filename, const  char* data){
   gzFile fp = gzopen(filename, "wb");
    gzputs(fp, data);
    gzputc(fp,'Y');
    gzprintf(fp, " Print Test %d", 1203);
    gzseek(fp, 2, SEEK_CUR);
    gzclose(fp);
}

void readgz(const  char* filename, const  char* otherfilename){
   gzFile fp = gzopen(filename, "rb");

    std::ofstream rp(otherfilename, std::ios_base::binary);

   const  int BUF = 1024;
   char in[BUF];
   int readsize(0);

   do {
       readsize = gzread(fp,in, BUF);
       rp.write(in, readsize);

   } while( !gzeof(fp) );


    rp.close();

    gzclose(fp);
}


void makegz(const  char* filename, const  char* otherfilename){
   gzFile fp = gzopen(filename,"wb");


    std::ifstream rp(otherfilename, std::ios_base::binary);

   const  int BUF = 1024;
   char in[BUF];
   int readsize(0);

   do{
       rp.read(in, BUF);
       readsize = (int)rp.gcount();
       gzwrite(fp, in, readsize);

   } while( !rp.eof());


    rp.close();

    gzclose(fp);
}

- 목록:

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 Paul Kim 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>