16

クロスプラットフォームアプリケーション用にファイルをアーカイブしようとしていますが、Minizip(zlib上に構築)はアーカイバと同じくらい移植性が高いようです。

ただし、次のダミーコードを実行しようとすると、システムエラーが発生します[my executable] has stopped working. Windows can check online for a solution to the problem.

このライブラリの使用方法を教えてもらえますか?—(私が見つけることができるドキュメントやチュートリアルはどこにもありません)

zip_fileinfo zfi;

int main()
{
    zipFile zf = zipOpen("myarch.zip",APPEND_STATUS_ADDINZIP);
    int ret = zipOpenNewFileInZip(zf,
        "myfile.txt",
        &zfi,
        NULL,   0,
        NULL,   0,
        "my comment for this interior file",
        Z_DEFLATED,
        Z_NO_COMPRESSION
        );
    zipCloseFileInZip(zf);
    zipClose(zf, "my comment for exterior file");
    return 0;
}

仕様:Msys + MinGW、Windows 7、zlib125dll.zip/dll32のzlibwapi.dllを使用

4

3 に答える 3

22

この質問はGoogleで見つけましたが、完全で機能するコードが含まれていなかったため、今後の訪問者のためにここでいくつか提供します。

int CreateZipFile (std::vector<wstring> paths)
{
    zipFile zf = zipOpen(std::string(destinationPath.begin(), destinationPath.end()).c_str(), APPEND_STATUS_CREATE);
    if (zf == NULL)
        return 1;

    bool _return = true;
    for (size_t i = 0; i < paths.size(); i++)
    {
        std::fstream file(paths[i].c_str(), std::ios::binary | std::ios::in);
        if (file.is_open())
        {
            file.seekg(0, std::ios::end);
            long size = file.tellg();
            file.seekg(0, std::ios::beg);

            std::vector<char> buffer(size);
            if (size == 0 || file.read(&buffer[0], size))
            {
                zip_fileinfo zfi = { 0 };
                std::wstring fileName = paths[i].substr(paths[i].rfind('\\')+1);

                if (S_OK == zipOpenNewFileInZip(zf, std::string(fileName.begin(), fileName.end()).c_str(), &zfi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION))
                {
                    if (zipWriteInFileInZip(zf, size == 0 ? "" : &buffer[0], size))
                        _return = false;

                    if (zipCloseFileInZip(zf))
                        _return = false;

                    file.close();
                    continue;
                }
            }
            file.close();
        }
        _return = false;
    }

    if (zipClose(zf, NULL))
        return 3;

    if (!_return)
        return 4;
    return S_OK;
}
于 2014-09-09T11:47:45.543 に答える
4

minizipライブラリには例が付属しています。解凍する場合はminizip.c、解凍する場合はminiunz.c。どちらも、ライブラリの使用方法を示すコマンドラインユーティリティです。しかし、彼らは混乱しています。

また、zfiを入力する必要がありますzip_fileinfo。少なくとも、構造をゼロに初期化する必要があります。zfiには、を使用して保存するファイルに関する情報が含まれていますzipOpenNewFileInZip。構造には、「myfile.txt」の日付と属性が含まれている必要があります。

zipの問題を診断するには、PKWAREデスクトップを使用することをお勧めします。これは、ZIP内のファイルとZIPファイル自体の構造/プロパティを示しています。myarch.zipを開くと、エラーが発生したことがわかりました。ファイルのプロパティにドリルダウンしたところ、属性がオフになっていることがわかりました。

于 2012-07-09T10:18:06.813 に答える
2

miniziplibは十分に文書化されています。詳細については、zip.hを開いてください。

ここでお伝えできますが、zipOpenに間違ったパラメーターを渡した可能性があります。(APPEND_STATUS_ADDINZIPには既存のzipファイルが必要です!)

また、zipOpenが有効なzipFileハンドルを返すかどうかを確認してください。

于 2012-07-07T02:55:07.917 に答える