C++ 压缩文件及文件夹方法 使用zlib开源库
简介
本文将介绍如何使用zlib开源库在C++中实现文件及文件夹的压缩。
安装zlib
首先需要安装zlib开源库,可以在官网下载源码进行编译安装。也可以通过包管理器进行安装,如在Ubuntu中执行以下命令:
sudo apt-get install zlib1g-dev
压缩文件
使用zlib库的压缩文件函数可以将一个文件进行压缩,并输出一个压缩后的文件。以下是一个示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zlib.h>
#define CHUNK_SIZE 16384
int main(int argc, char **argv) {
gzFile infile;
char *outfile;
char buf[CHUNK_SIZE];
int len;
if(argc != 3) {
printf("usage: %s infile outfile", argv[0]);
exit(1);
}
infile = gzopen(argv[1], "rb");
if(!infile) {
printf("Fail to open %s", argv[1]);
exit(1);
}
outfile = (char *) malloc(strlen(argv[2]) + 4);
strcpy(outfile, argv[2]);
strcat(outfile, ".gz");
gzFile outfile_gz = gzopen(outfile, "wb");
if(!outfile_gz) {
printf("Fail to open %s", outfile);
exit(1);
}
while((len = gzread(infile, buf, CHUNK_SIZE)) > 0) {
gzwrite(outfile_gz, buf, len);
}
gzclose(infile);
gzclose(outfile_gz);
free(outfile);
return 0;
}
代码中使用了gzFile类型代表文件指针,gzopen函数打开源文件,gzopen函数打开输出文件,gzread函数进行读取,gzwrite函数进行写入。
压缩文件夹
使用zlib库压缩一个文件夹步骤如下:
- 打开需要压缩的文件夹
- 在输出文件夹中创建该文件夹
- 遍历该文件夹中的所有文件和子文件夹
- 如果是文件,则进行压缩,输出到新文件夹中
- 如果是子文件夹,则递归调用该文件夹
以下是一个示例代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/stat.h>
#include <zlib.h>
#define CHUNK_SIZE 16384
int is_file(const char *path) {
struct stat path_stat;
stat(path, &path_stat);
return S_ISREG(path_stat.st_mode);
}
void compress_file(const char *infile, const char *outfile) {
gzFile infile_gz = gzopen(infile, "rb");
if(!infile_gz) {
printf("Fail to open %s", infile);
exit(1);
}
gzFile outfile_gz = gzopen(outfile, "wb");
if(!outfile_gz) {
printf("Fail to open %s", outfile);
exit(1);
}
char buf[CHUNK_SIZE];
int len;
while((len = gzread(infile_gz, buf, CHUNK_SIZE)) > 0) {
gzwrite(outfile_gz, buf, len);
}
gzclose(infile_gz);
gzclose(outfile_gz);
}
void compress_folder(const char *src_folder, const char* dest_folder) {
DIR *dir;
struct dirent *entry;
char src_path[1024];
char dst_path[1024];
if (!(dir = opendir(src_folder))) {
printf("Fail to open %s", src_folder);
exit(1);
}
if(mkdir(dest_folder, 0777) == -1) {
printf("Fail to create %s", dest_folder);
exit(1);
}
while((entry = readdir(dir))) {
if (entry->d_type == DT_DIR) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
sprintf(src_path, "%s/%s", src_folder, entry->d_name);
sprintf(dst_path, "%s/%s", dest_folder, entry->d_name);
compress_folder(src_path, dst_path);
} else {
sprintf(src_path, "%s/%s", src_folder, entry->d_name);
sprintf(dst_path, "%s/%s.gz", dest_folder, entry->d_name);
if(is_file(src_path)) {
compress_file(src_path, dst_path);
}
}
}
closedir(dir);
}
int main(int argc, char **argv) {
if(argc != 3) {
printf("usage: %s src_folder dest_folder", argv[0]);
exit(1);
}
compress_folder(argv[1], argv[2]);
return 0;
}
以上就是文件及文件夹的压缩方法,如果需要解压缩,只需要使用zlib的解压函数即可。
示例演示
压缩单个文件:
int main(int argc, char **argv) {
compress_file("test1.txt", "test1.gz");
return 0;
}
压缩文件夹:
int main(int argc, char **argv) {
compress_folder("test_folder", "test_folder_gz");
return 0;
}
以上为本文的全部内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 压缩文件及文件夹方法 使用zlib开源库 - Python技术站