반응형

http://anster.egloos.com/2165172



오늘, 그리고 지난 주 금요일은 하루종일 압축 라이브러리와 씨름했다.

맨 처음에는 Zip으로 압축할려고 찾아봤더니, Zlib를 약간 개량한 Zziplib 란게 나왔는데,, 도저히 빌드 못하겠다.. 그래서 포기.

Zlib 는 사용할려고 기껏 빌드했더니,, 유니코드 지원이 안되더라. 

그래서 구글에서 유니코드를 지원하는 zlib 검색을 해보니 코드프로젝트에 등록되어있는 CGzip이 나왔다. 오. 사용법도 쉽고 간단하구만,, 해서 받고 압축 풀고 각종 에러를 해결하고 빌드하니 파일 하나만 압축이 가능하댄다 -_-; 제작자가 시간이 없어서 여러개를 압축하는데까지는 신경을 못썼댄다.

결국 코드프로젝트에서 LiteZip 이란 라이브러리를 찾아냈다. 찾아내서 압축을 풀고 보니 VC++ 5.0 프로젝트 워크스페이스가 나온다.
2010으로는 바로 변경 불가 -_-; 그래서 6.0으로 변환 후 다시 2010으로 변환. 

파일 내부의 소스를 보니 WIN32인 경우와 아닌 경우를 나누어 놓았던데,, 리눅스 호환 라이브러리다. 윈도우와 리눅스의 경우 두 경우 모두 컴파일 할 수 해 놓은 라이브러리인데, 굉장히 정교하게 짜여졌다는 느낌을 많이 받았다. 나도 이렇게 유용하고, 잘 설계된 라이브러리를 만들고 싶다.^^


아참, 그리고 LiteZip.h 에 다음과 같은 문장을 추가 해 주어야 한다.

// Edited 2011. 07. 18 By Anster.
// Functions for adding a "Directory" to a ZIP archive

DWORD WINAPI ZipAddDirA(HZIP, const char*, DWORD);
DWORD WINAPI ZipAddDirW(HZIP, const WCHAR* DWORD);

#ifdef UNICODE
#define ZipAddDir ZipAddDirW
typedef DWORD WINAPI ZipAddDirPtr(HZIP, const WCHAR*, DWORD);
#define ZIPADDDIRNAME "ZipAddDirW"
#else
#define ZipAddDir ZipAddDirA
typedef DWORD WINAPI ZipAddDirPtr(HZIP, const char*, DWORD);
#define ZIPADDDIRNAME "ZipAddDirA"
#endif

이 라이브러리의 설계자가 후에 디렉터리를 압축하는 함수(ZipAddDirA, W)을 라이브러리에 추가하면서
라이브러리에 함수를 익스포트 해 놓았으나 헤더파일에는 원형을 추가하지 않아서 사용하려면 빌드 에러가 난다.



2011. 7. 19 추가 

-_- 사용하다보니, 멀티바이트 버전의 ZipAddDirA 는 잘 작동하는데, ZipAddDirW 가 작동하지 않는다. 라이브러리를 내가 직접 고쳐서 써야하는것도 정말 너무너무 귀찮고 -_-;; 찾다보니 라이브러리가 아니라 CPP와 헤더파일로 첨부만 해서 함수를 사용하는 

Zip Utils 를 찾아냈다. zip_utils_src.zip

Clean, Elegant, Simple 한 C++/Win32 라이브러리라는데,, 이거마저 안되면 다른걸 또 찾아야된다 -_-


참고 - CGzip Lib http://www.codeproject.com/KB/cpp/cgzip.aspx
         LiteZip LIb http://www.codeproject.com/KB/library/LiteZip.aspx
         Zip Utils http://www.codeproject.com/KB/files/zip_utils.aspx
         Zip http://www.codeproject.com/KB/recipes/zip.aspx
         Boost Gzip http://www.boost.org/doc/libs/1_47_0/libs/iostreams/doc/classes/gzip.html
         Boost Zlib http://www.boost.org/doc/libs/1_47_0/libs/iostreams/doc/classes/zlib.html
         Boost Bzip2 http://www.boost.org/doc/libs/1_47_0/libs/iostreams/doc/classes/bzip2.html#examples
         Minizip http://www.winimage.com/zLibDll/minizip.html
         Minizip Example http://ddiggam.tistory.com/5

2011. 07. 21 추가

Zlib 압축 알고리즘과 Zip(PKZIP) 압축 알고리즘이 같아서 헤더 포맷만 맞추어주면 Zlib를 Zip 압축에 쓸수 있다고 한다.

참고 -  http://www.google.co.kr/url?sa=t&source=web&cd=3&ved=0CD0QFjAC&url=http%3A%2F%2Fkldp.org%2Fnode%206&ei=1LknTpmkAeydmQWMkvH_CQ&usg=AFQjCNF_WrrqYyFQRCWOYmAvk6wfpSADiQ

그리고 ZIP Utils 을 사용해서 압축을 하면 한글 파일과 폴더가 이상한 이름으로(like as 꽯꽥) 압축이 되는데, 

이는 헤더인 zip.h 와 unzip.h 를 수정하면 된다. CP_UTF8 -> CP_OEM 으로 변경하자. 

아래는 폴더를 압축하기 쉽게끔 만든 파일이다. 

CompressDirectory.cpp

다음과 같이 사용하면 된다.


#include <stdafx.h>
#include <zip.h>

BOOL SetCompressDirectory (HZIP* phZip, LPTSTR pszCompressPath, LPTSTR pszZipCreationPath, LPTSTR pszZipName );

int _tmain(int argc, _TCHAR* argv[])
{
    if (argc < 4)
        return 0;

    HZIP hZip;

    if ( !SetCompressDirectory ( &hZip, argv[1], argv[2], argv[3] ) )
        _tprintf ( _T("FAIL\n") );
    else
        _tprintf ( _T("SUCCESS\n") );

    return 0;
}


반응형

+ Recent posts