Создавать файлы в памяти, а затем помещать их в zip-архив с помощью 7-zip командной строки? - PullRequest
3 голосов
/ 12 января 2012

Я пытаюсь создавать zip-файлы на лету в C ++, я использую 7-zip, чтобы попытаться добиться этого, особенно я хочу использовать 7-zip командную строку (я хочу попробовать и изменитьисточник для этого).

Возможно ли это, и если да, то как мне поступить?

Ответы [ 3 ]

2 голосов
/ 12 января 2012

Использование 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 голосов
/ 12 января 2012

Некоторое время назад я наткнулся на эту ссылку , которая может обрабатывать zip-файлы.Проверьте, полезно ли это для вас.

1 голос
/ 12 января 2012

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, только 7z перенаправить STDIN с помощью каналов или каким-либо другим способом, который предоставляет ваша ОС. И вам придется запустить 7z несколько раз, если вам нужно добавить более одного файла.

...