[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언어를 사용한 파일 압축 및 해제에 대해 알아보았습니다.