在内存中创建文件然后使用7-zip命令行将它们推入zip存档?

时间:2012-01-12 06:50:08

标签: c++ stream zip 7zip

我正在尝试用C ++动态创建zip文件,我正在使用7-zip来尝试实现这一点,特别是我想使用7-zip命令行(我愿意尝试修改它的完成此事的来源)。

这是可能的,如果可以的话,我应该怎么做呢?

3 个答案:

答案 0 :(得分:2)

有时候我遇到了这个可以处理zip文件的link。 检查它是否对你有用。

答案 1 :(得分:2)

minizip与此类代码一起使用可以在Windows上完成工作。

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

答案 2 :(得分: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,只需7z使用管道或您的操作系统提供的其他方式重定向STDIN。如果您需要添加多个文件,则必须多次启动7z