我正在尝试使用C++动态创建zip文件,我正在尝试使用7-zip来完成这个任务,具体来说,我想要使用7-zip命令行(我愿意尝试修改其源代码以实现此目的)。
这是否可行?如果是,我应该如何操作?
我正在尝试使用C++动态创建zip文件,我正在尝试使用7-zip来完成这个任务,具体来说,我想要使用7-zip命令行(我愿意尝试修改其源代码以实现此目的)。
这是否可行?如果是,我应该如何操作?
在Windows系统上,使用类似下面这样的代码与minizip一起使用应该可以完成任务。
#define USEWIN32IOAPI
#include <zip.h>
#include <unzip.h>
#include <iowin32.h>
int toZip(const wchar_t* zipfile, const char* nameInZip, void* buf, size_t buf_size)
{
zlib_filefunc64_def ffunc;
fill_win32_filefunc64W(&ffunc);
zipFile zf = zipOpen2_64(zipfile, APPEND_STATUS_CREATE, NULL,&ffunc);
if(0 == zf) {
return -1;
}
zip_fileinfo zi;
zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
zi.dosDate = 0;
zi.internal_fa = 0;
zi.external_fa = 0;
zi.dosDate = 0; // no date
int zip64 = 1; // always zip64
unsigned long crcFile=0;
int opt_compress_level(Z_DEFAULT_COMPRESSION);
char* password = 0;
int err = zipOpenNewFileInZip3_64(zf,nameInZip,&zi,
NULL,0,NULL,0,NULL,
(opt_compress_level != 0) ? Z_DEFLATED : 0,
opt_compress_level,0,
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
password,crcFile, zip64);
if (ZIP_OK == err) {
err |= zipWriteInFileInZip (zf,buf,buf_size);
err |= zipCloseFileInZip(zf);
}
err |= zipClose(zf,NULL)
return err;
}
7-zip可以从STDIN
压缩,因此您可以使用特定的命令行参数启动7z进程,然后将数据放入其 STDIN
中。例如以下:
echo foo | 7z a arc.7z -sifoo.txt
echo bar | 7z a arc.7z -sibar.txt
将创建名为arc.7z
的文件,其中包含两个文件:foo.txt
和bar.txt
(分别包含文本foo
和bar
)。
当然在你的程序中你不需要调用echo
,只需要使用管道或其他操作系统提供的方法将STDIN
重定向到7z
即可。如果你需要添加多个文件,则需要多次启动7z
。
zlib
或其包装器,而不是 7-zip。 - n0rd