使用7-zip命令行创建内存中的文件并将它们压缩成zip存档?

3

我正在尝试使用C++动态创建zip文件,我正在尝试使用7-zip来完成这个任务,具体来说,我想要使用7-zip命令行(我愿意尝试修改其源代码以实现此目的)。

这是否可行?如果是,我应该如何操作?


你需要避免仅使用7zip创建临时.zip文件并将该文件读入内存吗? - Seth Carnegie
不,7zip在硬盘上创建一个zip文件应该没问题。但是要推送到其中的文件应该直接放入其中,而不是先创建再添加。 - meds
哦,根据SO上的另一篇帖子,7zip不支持从stdin读取文件,所以这个方法行不通。你要么自己编写或找到DEFLATE算法实现并编写文件头等内容,要么(就像你已经知道的那样)拆解7zip源代码。除非有人已经做过并分享了他们的工作,否则就只能这样了。 - Seth Carnegie
如果7z格式不是严格要求,使用zlib很容易实现。在7zip网站上有一个LZMA SDK可用,可能可以满足您的需求,但我没有直接的经验。 - Retired Ninja
2个回答

2

在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;
}

1

7-zip可以从STDIN压缩,因此您可以使用特定的命令行参数启动7z进程,然后将数据放入其 STDIN 中。例如以下:

echo foo | 7z a arc.7z -sifoo.txt
echo bar | 7z a arc.7z -sibar.txt

将创建名为arc.7z的文件,其中包含两个文件:foo.txtbar.txt(分别包含文本foobar)。

当然在你的程序中你不需要调用echo,只需要使用管道或其他操作系统提供的方法将STDIN重定向到7z即可。如果你需要添加多个文件,则需要多次启动7z


这些命令行确实有效,但是如果我尝试压缩一个zip文件,我会收到一个错误消息:“echo foo | 7z a arc.zip -sifoo.txt” => 系统错误:不支持此类接口。 - meds
可能 7-zip 不支持从 STDIN 压缩到每种格式。早期版本不支持压缩到它自己的 7z 格式。如果您需要压缩到 zip 格式,最好使用 zlib 或其包装器,而不是 7-zip。 - n0rd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接