Skip to content

Instantly share code, notes, and snippets.

@bakyeono
Created January 15, 2016 09:59
Show Gist options
  • Save bakyeono/47edba50202fc620701a to your computer and use it in GitHub Desktop.
Save bakyeono/47edba50202fc620701a to your computer and use it in GitHub Desktop.
uncompress-zip-in-cpp-with-xzip.md

C/C++ - 윈도우에서 zip 압축 풀기

Xzip을 이용해 윈도우에서 간단히 zip 압축 푸는 방법이다. 다양한 압축 라이브러리가 있지만 내가 찾아본 것 중에 Xzip 이 윈도우 전용이고 가장 간편한 것 같다. 다만 문서화가 되어 있지 않아서 데모 코드를 해석해서 사용법을 배워야 한다.

압축을 풀 때는 XUnzip.h, XUnzip.c 두 파일만 있으면 된다.

Xzip이

#include "XUnzip.h"

int uncompress(char* src_filename) {
    HZIP     hz;           // 압축 파일 핸들러
    ZIPENTRY ze;           // 압축 파일에 포함된 개별 파일을 나타내는 구조체
    ZRESULT  zr;           // 결과(에러)
    int      n_of_entries; // 압축 파일에 포함된 파일들의 개수
    int      result = 0;   // 이 함수의 반환값

    // zip 파일 열기
    hz = OpenZip(_T(src_filename), 0, ZIP_FILENAME);
    if (! hz) {
        std::cout << "File not found: " << src_filename << std::endl;
        return 1; // means file not found
    }

    // zip 파일 정보 읽기 (-1 index)
    memset(&ze, 0, sizeof(ze));
    GetZipItem(hz, -1, &ze);
    n_of_entries = ze.index;

    // 압축 해제 루프
    for (int i = 0; i < n_of_entries; ++i) {
        memset(&ze, 0, sizeof(ze));
        GetZipItem(hz, i, &ze);
        zr = UnzipItem(hz, i, ze.name, 0, ZIP_FILENAME);
        if (zr != ZR_OK) {
            std::cout << "Uncompress failed: " << ze.index << "- " << ze.name << std::endl;
            result = 2; // means some of the entries couldn't extracted.
        } else {
            std::cout << ze.index << "- " << ze.name << std::endl;
        }
    }

    // close zip file
    CloseZip(hz);

    return result; // 0: success,  1: file not found,  2: fail some entries
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment