zlib 라이브러리를 이용한 파일 압축 해제 클래스 작성
프로그래밍 언어/C++2010. 10. 26. 18:24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 | //Cgzip.h /* zlib을 이용한 Cgzip.h, Cgzip.cpp 클래스 작성 version 0.0.1, October 26th, 2010 Copyright (C) 2010 Copynull source bug report to copynull@nate.com */ #pragma once #include <Windows.h> #include "zlib.h" #pragma comment(lib, "zdll.lib") class Cgzip { FILE *fp; gzFile gFile; char destFile[FILENAME_MAX]; char buf[FILENAME_MAX]; int read; public: Cgzip(); virtual ~Cgzip(); bool Compress(char *input, int clevel = 6); bool Dcompress(char *input); void End(); bool CompressThreadCallback(); bool DCompressThreadCallback(); }; // Cgzip.cpp #include "stdafx.h" #include "Cgzip.h" DWORD WINAPI CompressThreadCallback(LPVOID parameter) { Cgzip *Owner = (Cgzip*) parameter; Owner->CompressThreadCallback(); return 0; } DWORD WINAPI DCompressThreadCallback(LPVOID parameter) { Cgzip *Owner = (Cgzip*) parameter; Owner->DCompressThreadCallback(); return 0; } Cgzip::Cgzip() { fp = NULL; read = 0; memset(destFile, 0, sizeof(FILENAME_MAX)); memset(buf, 0, sizeof(FILENAME_MAX)); } Cgzip::~Cgzip() { } bool Cgzip::Compress(char *input, int clevel) { End(); sprintf(destFile, "%s.gz", input); // 압축할 파일 열기 fp = fopen(input, "rb"); if(fp == NULL) return false; // 저장할 파일 열기 gFile = gzopen(destFile, "wb"); if(gFile == NULL) return false; // 압축 레벨 변경 (레벨 1 ~ 9까지 변경) 1:압축안함, 9:최대압축 if(clevel >= 9) clevel = 9; if(clevel <= 1) clevel = 1; if(gzsetparams(gFile, clevel, Z_DEFAULT_STRATEGY) != Z_OK) return false; // 압축 진행 스레드 생성 및 압축 실행 HANDLE WorkerThread = CreateThread(NULL, 0, ::CompressThreadCallback, this, 0, NULL); WaitForSingleObject(WorkerThread, INFINITE); return true; } void Cgzip::End() { if(fp) fclose(fp); fp = NULL; read = 0; memset(destFile, 0, sizeof(FILENAME_MAX)); memset(buf, 0, sizeof(FILENAME_MAX)); } bool Cgzip::Dcompress(char *input) { End(); // 압축 파일명 해제 memset(destFile, 0, sizeof(FILENAME_MAX)); strncpy(destFile, input, strlen(input)-3); destFile[strlen(input)-3] = 0; // 압축 해제 저장 파일 생성 fp = fopen(destFile, "wb"); if(fp == NULL) return false; gFile = gzopen(input, "rb"); if(gFile == NULL) return false; // 압축 해제 스레드 생성 및 압축 실행 HANDLE WorkerThread = CreateThread(NULL, 0, ::DCompressThreadCallback, this, 0, NULL); WaitForSingleObject(WorkerThread, INFINITE); return true; } bool Cgzip::CompressThreadCallback() { while(read = fread(buf, sizeof(char), FILENAME_MAX, fp)) { if(gzwrite(gFile, buf, read) < 0) return false; } gzclose(gFile); fclose(fp); return true; } bool Cgzip::DCompressThreadCallback() { while(read = gzread(gFile, buf, FILENAME_MAX)) { if(fwrite(buf, sizeof(char), read, fp) < 0) { gzclose(gFile); fclose(fp); return false; } } gzclose(gFile); fclose(fp); return true; } // main.cpp #include "stdafx.h" #include "Cgzip.h" int _tmain(int argc, _TCHAR* argv[]) { char *compInput = "c:\\a.avi"; char *dcompInput = "c:\\a.avi.gz"; Cgzip gz; if(gz.Compress(compInput, 9)) printf("압축 완료\n\n"); if(gz.Dcompress(dcompInput)) printf("압축 해제 완료\n\n"); return 0; } |
알집으로도 정상적으로 잘 열리는 것을 확인할 수 있다...
'프로그래밍 언어 > C++' 카테고리의 다른 글
ADO Connection Pool에 대하여 (0) | 2011.10.18 |
---|---|
[해결] LIBCMT.lib error LNK 2005: MSVCRT.lib에 이미 정의되어 있습니다 (0) | 2011.05.05 |
유니코드 한글 문자열 조합형으로 변환 후 출력하기 (0) | 2010.09.29 |
c언어 자료형 (0) | 2010.09.08 |
2. CORBA와 DCOM의 비교 (0) | 2010.07.04 |