-
zlib 라이브러리 - zip 파일 간단히 생성해 보기zlib 2022. 10. 24. 00:31
강의 주소 : https://youtu.be/xwXpdgN-UG8
공부를 글로 남기는 습관을 들이려 내용들을 기록하는 중입니다.
체계적이지 않으며, 전문적이지 않습니다.
의식의 흐름으로 기록합니다.강의 목표
zlib를 이용하여 zip library를 제어하는 방법 배우기zip-library는 zlib의 delfate알고리즘을 사용하는 대표적인 라이브러리 이다.
파일을 압축하는 형태의 파일 포맷이다.(?????????????무슨말일까요???????)
확장자가 zip로 끝나는 파일들 입니다.zlib를 윈도우에 포팅하면서 함께 포팅한 minizip library가 있습니다.
이 minizip이라는 라이브러리가 zlib를 기반으로 해서
zip file을 제어하는 기능을 가지고 있는 라이브러리 입니다.해서 minizip에 있는 api를 이용하게 되면 zip file을 생성하거나 생성된 zip file을 풀거나,
zip file에 있는 목록을 얻어오거나 하는 여러가지 기능들을 이용할 수 있다.이번시간에는 간단한 형태의 zip file을 생성하는 예제를 만들어 보도록 하겠습니다.
프로젝트 생성.
zlib 라이브러리 visual studio 연결.
프로젝트와 zlib와 연결을 해주자. zlib 관련 .h 파일들이 있는 폴더를 포함. lib파일이 있는 폴더와 연결 실제 사용하는 파일명을 연결 Debug모드는 파일명이 다르니까 재설정
91song4.tistory.com
이번 교육에선
#include <zlib/zlib.h> 가 아닌 #include <zlib/zip.h> 헤더를 가져온다.
zip.h는 zip file 생성에 관련된 api들이 정의되어 있습니다.
unzip.h는 zip file 압축해제에 관련된 api들이 정의되어 있습니다.파일을 읽어들여서 zip file에 추가하는 형식으로 코드를 적어 보겠습니다.
가장먼저 할 일은 zip파일을 생성하는 일입니다.
/* zipOpen(const char *pathname, int append) pathname : 생성할 파일의 이름 append : 3개의 option이 있다. 1)APPEND_STATUS_CREATE (0) 2)APPEND_STATUS_CREATEAFTER (1) 3)APPEND_STATUS_ADDINZIP (2) 1)zip file을 새로 생성. 2)file의 끝에 zip file정보를 새로운 zip file로 생성한다.(?) zip file자체를 실행파일로 만들어서 자동으로 압축을 푸는 파일이다. SFX(Self-extracting file)Archive <- (내생각엔 이걸 말씀하시나 싶다 정확하진 않다.) 3)기존의 zip file이 있고, 그 파일을 열고 추가를 한다. return data type은 zipFile data type이다. //zipFile == void* */ do{ zipFile zf = zipOpen("xxx.zip", APPEND_STATUS_CREATE); if(zf==NULL) break; zipClose(zf, "global_comment"); }while(false);
zip file을 생성했다면 zip file 내부에 압축목록을 만들어야 합니다.
zip_fileinfo info; //file의 time에 대한 정보 (언제 만들어졌는가 등) memset(&info, 0, sizeof(zip_fileinfo)); time_t nt; time(&nt); //nt에 현재 초단위 시간정보를 전달. struct tm* tdata = localtime(&nt); info.tmz_date.tm_hour = tdata->tm_hour; info.tmz_date.tm_mday = tdata->tm_mday; info.tmz_date.tm_min = tdata->tm_min; info.tmz_date.tm_mon = tdata->tm_mon; info.tmz_date.tm_sec = tdata->tm_sec; info.tmz_date.tm_year = tdata->tm_year; int ret = zipOpenNewFileInZip(zf, "x.jpg", &info, NULL, 0, NULL, 0, "comment", Z_DEFLATED, Z_DEFAULT_COMPRESSION); /* 1) zipFile 2) 생성할 목록의 이름 3) zip_fileinfo 4) ~ 7) 엑스트라정보들 8) 코멘트 9) 기본 압축알고리즘 //다른 알고리즘은 사용불가능 10) 압축레벨 */ ////////////////////////////////////////////////// 기록시작 ////////////////////////////////////////////////// zipCloseNewFileInZip(zf);
//기록시작 do{ std::ifstream fp; fp.open("x.jpg", std::ios_base::binary); if(!fp) break; const int BUF = 1024; Bytef in[BUF]; do{ fp.read((char*)in, BUF); int readsize = fp.gcount(); zipWriteInFileInZip(zf, (const void*)in, readsize); }while(!fp.eof()); fp.close(); }while(false);
성공을 했는데 정말 이상한점이 생겼다.
처음에 뭐가 잘 안되길래 프로그램에 들어가서 중단점을 눌러서 확인해보던차에 발견한 것이다..
#include <iostream> #include<fstream> #include<zlib/zip.h> int main() { do { zipFile zf = zipOpen("sample.zip", APPEND_STATUS_CREATE); if (!zf) break; zip_fileinfo info; memset(&info, 0, sizeof(zip_fileinfo)); time_t t = time(&t); tm *tdata = localtime(&t); info.tmz_date.tm_year = tdata->tm_year; info.tmz_date.tm_mon = tdata->tm_mon; info.tmz_date.tm_mday = tdata->tm_mday; info.tmz_date.tm_hour = tdata->tm_hour; info.tmz_date.tm_min = tdata->tm_min; info.tmz_date.tm_sec = tdata->tm_sec; int z_status = zipOpenNewFileInZip(zf, "sample.jpg", &info, NULL, 0, NULL, 0, "comment", Z_DEFLATED, Z_DEFAULT_COMPRESSION); do { std::ifstream fp; fp.open("sample.jpg", std::ios_base::binary); //////////////////////////////문제의 부분////////////////////////////// if (!fp) break; const int BUF = 1024; Bytef in[BUF]; int test_count = 0; do { fp.read((char*)in, BUF); int readsize = (int)fp.gcount(); std::cout << ++test_count << std::endl; zipWriteInFileInZip(zf, in, readsize); } while (!fp.eof()); fp.close(); } while (false); zipCloseFileInZip(zf); zipClose(zf, "global comment"); } while (false); system("pause"); return 0; }
코드는 이렇다.
if(!fp) break; 코드부분이 중단점을 누르고 진행해보면 break에 걸려서 바로 밖으로 빠져나가버린다.
진행 전. F10을눌러 프로시저단위실행 break에 걸려 밖으로 빠져나왔다.
이렇게 되는데 어떻게 압축이 됐지? 궁금해서모두 주석을 걸고 빌드하고 실행을 해봤다.
실패했다. 그래서 다음 실험을 해봤다.
역시나 디버그모드로는 저쪽으로 접근을 하지 않는다. 콘솔창을 통해 확인을 해보자.
system("pause");을 걸어보았다.역시나 진입시 break에 걸려 빠져나왔다.
디버깅으론 파일을 여는대도 실패했다.이젠 다시 실행파일로 돌아가보자. 카운트가 올라가는지 확인해야겠다.
int test_count 이다. 블럭안에 진입을하면 카운트를 해주는 것이다.
system("pause")로 콘솔창이 꺼지기 전에 붙잡아뒀다.
실행파일은 진입을 한다... 뭐까.................? 왜 이렇게 되는지 궁금하다... 일단 오늘은 너무 졸려서 자야겠다.
'zlib' 카테고리의 다른 글
zlib 라이브러리 - 간단히 zip 파일 해제하기 (0) 2022.10.25 zlib 라이브러리 minizip 추가하기 (0) 2022.10.23 zlib 라이브러리 - compress, uncompress 사용하기 (0) 2022.10.23 zlib 라이브러리 - block 관련 샘플 (0) 2022.10.23 zlib 라이브러리 - Dictionary 사용하기 (0) 2022.10.23