2012-01-12 56 views
3

私はZipファイルをC++で作成しようとしています。私は7-zipを使ってこれを試しています。具体的には、7-zipコマンドラインを使用したいと思います。(私は、これを達成するために)。メモリにファイルを作成し、7-zipコマンドラインを使用してzipアーカイブにプッシュしますか?

これが可能ですか?もしそうなら、どうすればいいですか?

+0

7zipで一時的な.zipファイルを作成し、そのファイルをメモリに読み込むだけでよいのですか? –

+0

いいえ、7zipでハードディスクのどこかにジップを作成しても問題ありません。しかし、それにプッシュするファイルは、直接作成してから作成するのではなく、直接追加する必要があります。 – tweetypi

+0

ああ、SOの7zipの別の記事によると、stdinからファイルを読み込むことはできません。 DEFLATEアルゴリズムの実装を書いたり、見つけたり、ファイルヘッダなどを自分で書き込んだり、(あなたが知っているように)あなたが言ったように7zipソースを解体する必要があります。つまり、他の誰かが以前にそれをして仕事を分かち合っていない限り。 –

答えて

1

7-ZipはSTDINから圧縮することができますので、あなたは、特定のコマンドライン引数で7zのプロセスを開始し、そのSTDINにデータを置きます。以下の例:(それぞれのテキストfoobarを含む)foo.txtbar.txt

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

は、内部の二つのファイルとarc.7zファイルを作成します。

もちろん、お使いのプログラムからechoに電話する必要はありません。STDINにはSTDINをリダイレクトするだけで、お使いのOSが提供する方法で呼び出すことができます。複数のファイルを追加する必要がある場合は、7zを何回か起動する必要があります。

+0

これらのコマンドラインは機能しますが、代わりにzipを圧縮しようとするとエラーが発生します。 'echo foo | 7z a arc.zip -sifoo.txt '=>システムエラー: このようなインターフェイスはサポートされていません – tweetypi

+0

おそらく7-zipはSTDINからあらゆるフォーマットへの圧縮をサポートしていません。以前のバージョンでは、それ自身の7z形式の圧縮をサポートしていませんでした。あなたがzip形式に圧縮する必要があるなら、 'zlib'に固執するか、7-zipの代わりにwrapperを使用する方がよいでしょう。 – n0rd

2

いつか私はこのファイルを扱うことができるlinkに出くわしました。 あなたに役立つかどうかを確認してください。

+0

を使用するか、minizipを直接使用してください。 http://www.winimage.com/zLibDll/minizip.html – Totonga

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; 
} 
関連する問題