📜  归档 - C 编程语言(1)

📅  最后修改于: 2023-12-03 14:54:13.664000             🧑  作者: Mango

归档 - C 编程语言

简介

C 语言是一种通用的、面向过程式的计算机程序设计语言,由丹尼斯·里奇在贝尔实验室设计开发。C 语言的历史可以追溯到 20 世纪 70 年代初。C 语言广泛应用于系统软件、应用软件、嵌入式系统、游戏开发等领域。C 语言也是许多其他计算机语言的基础。

归档是指将一组文件或数据存档成一个文件,以便于存储、传输和备份。C 语言可以用于实现归档程序,从而实现文件和数据的存档、压缩和解压缩等功能。

归档库

C 语言中有许多归档库可以使用,以下是其中几个常用的归档库:

zlib

zlib 是一个通用的压缩库,它可以用于压缩和解压缩数据,并支持 gzip、deflate 和 zlib 格式。zlib 库非常小巧,可以方便地嵌入到 C 语言程序中。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zlib.h>

#define CHUNK 16384

int compress_data(const char *source, const char *dest)
{
    char buf[CHUNK];
    int ret;
    gzFile file_out = gzopen(dest, "wb");
    if (!file_out) {
        return -1;
    }
    FILE *file_in = fopen(source, "rb");
    if (!file_in) {
        return -1;
    }
    while (!feof(file_in)) {
        size_t bytes_read = fread(buf, 1, CHUNK, file_in);
        if (bytes_read > 0) {
            ret = gzwrite(file_out, buf, bytes_read);
            if (ret != bytes_read) {
                gzclose(file_out);
                fclose(file_in);
                return -1;
            }
        } else if (ferror(file_in)) {
            gzclose(file_out);
            fclose(file_in);
            return -1;
        } else {
            break;
        }
    }
    gzclose(file_out);
    fclose(file_in);
    return 0;
}

int uncompress_data(const char *source, const char *dest)
{
    char buf[CHUNK];
    int ret;
    gzFile file_in = gzopen(source, "rb");
    if (!file_in) {
        return -1;
    }
    FILE *file_out = fopen(dest, "wb");
    if (!file_out) {
        return -1;
    }
    while (!gzeof(file_in)) {
        size_t bytes_read = gzread(file_in, buf, CHUNK);
        if (bytes_read > 0) {
            ret = fwrite(buf, 1, bytes_read, file_out);
            if (ret != bytes_read) {
                fclose(file_out);
                gzclose(file_in);
                return -1;
            }
        } else if (gzeof(file_in)) {
            break;
        } else if (gzerror(file_in, &ret)) {
            fclose(file_out);
            gzclose(file_in);
            return -1;
        }
    }
    fclose(file_out);
    gzclose(file_in);
    return 0;
}
libzip

libzip 是一个支持读取、创建、修改和提取 ZIP 文件的库。它提供了一系列的 API,可以方便地实现 ZIP 文件的操作。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zip.h>

int compress_data(const char *source, const char *dest)
{
    int err;
    struct zip *za = zip_open(dest, ZIP_CREATE|ZIP_TRUNCATE, &err);
    if (!za) {
        return -1;
    }
    FILE *file_in = fopen(source, "rb");
    if (!file_in) {
        zip_close(za);
        return -1;
    }
    struct zip_source *source_in = zip_source_file(za, source, 0, 0);
    if (!source_in) {
        zip_close(za);
        fclose(file_in);
        return -1;
    }
    if (zip_file_add(za, source, source_in, ZIP_FL_ENC_UTF_8) < 0) {
        zip_source_free(source_in);
        zip_close(za);
        fclose(file_in);
        return -1;
    }
    zip_source_free(source_in);
    zip_close(za);
    fclose(file_in);
    return 0;
}

int uncompress_data(const char *source, const char *dest)
{
    int err;
    struct zip *za = zip_open(source, 0, &err);
    if (!za) {
        return -1;
    }
    struct zip_stat st;
    zip_stat_init(&st);
    zip_stat(za, "", 0, &st);
    char *buf = (char *) malloc(st.size);
    if (!buf) {
        zip_close(za);
        return -1;
    }
    struct zip_file *zf = zip_fopen(za, "", 0);
    if (!zf) {
        free(buf);
        zip_close(za);
        return -1;
    }
    zip_fread(zf, buf, st.size);
    zip_fclose(zf);
    zip_close(za);
    FILE *file_out = fopen(dest, "wb");
    if (!file_out) {
        free(buf);
        return -1;
    }
    fwrite(buf, 1, st.size, file_out);
    fclose(file_out);
    free(buf);
    return 0;
}
总结

C 语言中有许多归档库可以使用,开发者可以根据自己的需求,选择合适的库来实现归档功能。归档功能不仅可以用于文件和数据的存档,还可以用于网络传输、备份等领域。