[c언어] 파일 압축 및 해제
이 포스트에서는 c언어를 사용하여 파일을 압축하고 해제하는 방법에 대해 알아보겠습니다.
1. 파일 압축
파일을 압축하기 위해서는 zlib 라이브러리를 사용할 수 있습니다. zlib 라이브러리는 파일이나 데이터를 압축하고 해제하는 데 사용되는 강력하고 효율적인 압축 라이브러리입니다.
아래는 파일을 zlib을 사용하여 압축하는 간단한 예제 코드입니다.
#include <stdio.h>
#include <stdlib.h>
#include <zlib.h>
#define CHUNK 16384
int compress_file(const char *source, const char *dest) {
FILE *src = fopen(source, "rb");
FILE *dst = fopen(dest, "wb");
if (!src || !dst) return -1;
int ret, flush;
unsigned have;
z_stream strm;
unsigned char in[CHUNK];
unsigned char out[CHUNK];
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
ret = deflateInit(&strm, Z_DEFAULT_COMPRESSION);
if (ret != Z_OK) return ret;
do {
strm.avail_in = fread(in, 1, CHUNK, src);
if (ferror(src)) {
(void)deflateEnd(&strm);
return Z_ERRNO;
}
flush = feof(src) ? Z_FINISH : Z_NO_FLUSH;
strm.next_in = in;
do {
strm.avail_out = CHUNK;
strm.next_out = out;
ret = deflate(&strm, flush);
have = CHUNK - strm.avail_out;
if (fwrite(out, 1, have, dst) != have || ferror(dst)) {
(void)deflateEnd(&strm);
return Z_ERRNO;
}
} while (strm.avail_out == 0);
} while (flush != Z_FINISH);
(void)deflateEnd(&strm);
fclose(src);
fclose(dst);
return Z_OK;
}
위의 코드는 zlib을 사용하여 파일을 압축하는 함수를 구현한 것입니다.
2. 파일 해제
파일을 해제하기 위해서도 zlib 라이브러리를 사용하여 압축을 해제할 수 있습니다.
아래는 압축된 파일을 zlib을 사용하여 해제하는 간단한 예제 코드입니다.
#include <stdio.h>
#include <stdlib.h>
#include <zlib.h>
#define CHUNK 16384
int decompress_file(const char *source, const char *dest) {
FILE *src = fopen(source, "rb");
FILE *dst = fopen(dest, "wb");
if (!src || !dst) return -1;
int ret;
unsigned have;
z_stream strm;
unsigned char in[CHUNK];
unsigned char out[CHUNK];
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.avail_in = 0;
strm.next_in = Z_NULL;
ret = inflateInit(&strm);
if (ret != Z_OK) return ret;
do {
strm.avail_in = fread(in, 1, CHUNK, src);
if (ferror(src)) {
(void)inflateEnd(&strm);
return Z_ERRNO;
}
if (strm.avail_in == 0) break;
strm.next_in = in;
do {
strm.avail_out = CHUNK;
strm.next_out = out;
ret = inflate(&strm, Z_NO_FLUSH);
if (ret == Z_NEED_DICT || ret == Z_DATA_ERROR || ret == Z_MEM_ERROR) {
(void)inflateEnd(&strm);
return ret;
}
have = CHUNK - strm.avail_out;
if (fwrite(out, 1, have, dst) != have || ferror(dst)) {
(void)inflateEnd(&strm);
return Z_ERRNO;
}
} while (strm.avail_out == 0);
} while (ret != Z_STREAM_END);
(void)inflateEnd(&strm);
fclose(src);
fclose(dst);
return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}
위의 코드는 zlib을 사용하여 압축을 해제하는 함수를 구현한 것입니다.
결론
이러한 방법을 사용하여 c언어를 이용해 파일을 압축하고 해제할 수 있습니다. zlib 라이브러리는 강력하고 효율적이며 다양한 플랫폼에서 사용할 수 있어 많은 개발자들에게 인기가 있습니다.
더 나아가, zlib 라이브러리의 상세한 내용은 공식 zlib 웹사이트에서 확인할 수 있습니다.
이상으로 c언어를 사용한 파일 압축 및 해제에 대해 알아보았습니다.