使用miniz解压缩zip文件

·

miniz库真的很mini,只有两个miniz.c和miniz.h两个文件。直接放到工程里就能用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "miniz.h"

// 函数声明,用于创建目录
int make_dir(const char *dir);

int main(int argc, char *argv[]) {
    if (argc != 3) {
        fprintf(stderr, "Usage: %s <zipfile> <outdir>\n", argv[0]);
        return 1;
    }

    const char *zipfile = argv[1];
    const char *outdir = argv[2];

    mz_zip_archive zip_archive;
    memset(&zip_archive, 0, sizeof(zip_archive));

    if (!mz_zip_reader_init_file(&zip_archive, zipfile, 0)) {
        fprintf(stderr, "Failed to initialize zip reader\n");
        return 1;
    }

    int num_files = mz_zip_reader_get_num_files(&zip_archive);
    for (int i = 0; i < num_files; i++) {
        mz_zip_archive_file_stat file_stat;
        if (!mz_zip_reader_file_stat(&zip_archive, i, &file_stat)) {
            fprintf(stderr, "Failed to get file stat for index %d\n", i);
            mz_zip_reader_end(&zip_archive);
            return 1;
        }

        char full_path[4096];
        snprintf(full_path, sizeof(full_path), "%s/%s", outdir, file_stat.m_filename);

        if (file_stat.m_is_directory) {
            if (make_dir(full_path) != 0) {
                fprintf(stderr, "Failed to create directory: %s\n", full_path);
                mz_zip_reader_end(&zip_archive);
                return 1;
            }
            continue;
        }

        void *buffer = malloc(file_stat.m_uncomp_size);
        if (!buffer) {
            fprintf(stderr, "Failed to allocate memory for file\n");
            mz_zip_reader_end(&zip_archive);
            return 1;
        }

        if (!mz_zip_reader_extract_to_mem(&zip_archive, i, buffer, file_stat.m_uncomp_size, 0)) {
            fprintf(stderr, "Failed to extract file %s\n", file_stat.m_filename);
            free(buffer);
            mz_zip_reader_end(&zip_archive);
            return 1;
        }

        FILE *outfile = fopen(full_path, "wb");
        if (!outfile) {
            fprintf(stderr, "Failed to open output file %s\n", full_path);
            free(buffer);
            mz_zip_reader_end(&zip_archive);
            return 1;
        }

        fwrite(buffer, 1, file_stat.m_uncomp_size, outfile);
        fclose(outfile);
        free(buffer);
    }

    mz_zip_reader_end(&zip_archive);
    printf("Successfully extracted %s to %s\n", zipfile, outdir);
    return 0;
}

// 创建目录的函数实现
#ifdef _WIN32
#include <direct.h>
#define mkdir(p, m) _mkdir(p)
#else
#include <sys/stat.h>
#include <sys/types.h>
#define mkdir(p, m) mkdir(p, m)
#endif

int make_dir(const char *dir) {
    int ret = mkdir(dir, 0755);
    if (ret != 0) {
        fprintf(stderr, "Error creating directory: %s\n", dir);
        return 1;
    }
    return 0;
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注