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;
}
发表回复