クロスプラットフォームアプリケーション用にファイルをアーカイブしようとしていますが、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を使用
この質問は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;
}
Minizipライブラリには例が付属しています。 minizip.c圧縮の場合、miniunz.c解凍の場合。どちらも、ライブラリの使用方法を示すコマンドラインユーティリティです。しかし、それらは混乱しています。
また、zfi Zip_fileinfo
に入力する必要があります。少なくとも、構造をゼロに初期化する必要があります。 zfiには、zipOpenNewFileInZip
を使用して保存するファイルに関する情報が含まれています。構造には、「myfile.txt」の日付と属性が含まれている必要があります。
Zipの問題を診断するにはPKWAREデスクトップを使用することをお勧めします。 Zip内のファイルとZipファイル自体の構造/プロパティが表示されます。 myarch.Zipを開くと、エラーが発生したことがわかりました。ファイルのプロパティにドリルダウンしたところ、属性がオフになっていることがわかりました。
Miniziplibは十分に文書化されています。詳細については、Zip.hを開いてください。
ここでお伝えできますが、zipOpenに間違ったパラメーターを渡した可能性があります。 (APPEND_STATUS_ADDINZIPには既存のZipファイルが必要です!)
また、zipOpenが有効なzipFileハンドルを返すかどうかを確認してください。