私はZipファイルをC++で作成しようとしています。私は7-zipを使ってこれを試しています。具体的には、7-zipコマンドラインを使用したいと思います。(私は、これを達成するために)。メモリにファイルを作成し、7-zipコマンドラインを使用してzipアーカイブにプッシュしますか?
これが可能ですか?もしそうなら、どうすればいいですか?
私はZipファイルをC++で作成しようとしています。私は7-zipを使ってこれを試しています。具体的には、7-zipコマンドラインを使用したいと思います。(私は、これを達成するために)。メモリにファイルを作成し、7-zipコマンドラインを使用してzipアーカイブにプッシュしますか?
これが可能ですか?もしそうなら、どうすればいいですか?
7-ZipはSTDIN
から圧縮することができますので、あなたは、特定のコマンドライン引数で7zのプロセスを開始し、そのSTDIN
にデータを置きます。以下の例:(それぞれのテキストfoo
とbar
を含む)foo.txt
とbar.txt
:
echo foo | 7z a arc.7z -sifoo.txt
echo bar | 7z a arc.7z -sibar.txt
は、内部の二つのファイルとarc.7z
ファイルを作成します。
もちろん、お使いのプログラムからecho
に電話する必要はありません。STDIN
にはSTDIN
をリダイレクトするだけで、お使いのOSが提供する方法で呼び出すことができます。複数のファイルを追加する必要がある場合は、7z
を何回か起動する必要があります。
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;
}
7zipで一時的な.zipファイルを作成し、そのファイルをメモリに読み込むだけでよいのですか? –
いいえ、7zipでハードディスクのどこかにジップを作成しても問題ありません。しかし、それにプッシュするファイルは、直接作成してから作成するのではなく、直接追加する必要があります。 – tweetypi
ああ、SOの7zipの別の記事によると、stdinからファイルを読み込むことはできません。 DEFLATEアルゴリズムの実装を書いたり、見つけたり、ファイルヘッダなどを自分で書き込んだり、(あなたが知っているように)あなたが言ったように7zipソースを解体する必要があります。つまり、他の誰かが以前にそれをして仕事を分かち合っていない限り。 –