をZIPファイルWindows(XP/2003年)をC/C++
質問
いなければならないというニーズをZIPファイルからフォルダWindowsのC/C++のApiを用意しています。できますが、こVBScriptのShell32.申請CopyHere方法、このチュートリアルする方法を説明するいはC#また、もしC API(C++でも、プロジェクトで使用MFC).
さんに本当に感謝して誰もが共有できるサンプルCコードで成功をzipファイルWindows XP/2003年.失敗した場合、誰で固docsやチュートリアルとなる、MSDNの検索なって現れます。んでいる必要性を回避するために船舶は、第三者のlibのためこの機能を明らかにがんなどへのアクセスします。Google検索を上げなけでは説の断片の情報です。ことを期待している地域は、別のことを共有することができま残す!
解決
編集:この答えは古いですが、私は、削除できませんでした。次の一
https://stackoverflow.com/a/121720/3937
-----独自の回答-----
ありサンプルコードでいうとこちら
[編集:リンクは破】
http://www.eggheadcafe.com/software/aspnet/31056644/using-shfileoperation-to.aspx
をお読みください取り扱いについては監視のためのスレッドを完了します。
編集:からのコメントこのコードのみの作品は、既存のzipファイルが@サイモン このコードを空白にzipファイル
FILE* f = fopen("path", "wb");
fwrite("\x50\x4B\x05\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 22, 1, f);
fclose(f);
他のヒント
どなたでも、コメントが、このままでしか動作をすでに作成されたZipファイルです。コンテンツにもない既存のzipファイル、またはエラーが表示されます。こちらではのサンプルコードが作れて嬉しかったでに受け入れの答えです。必要なものへのリンクをshell32.リチウムイオン電池及びもkernel32.lib(CreateToolhelp32Snapshot).
#include <windows.h>
#include <shldisp.h>
#include <tlhelp32.h>
#include <stdio.h>
int main(int argc, TCHAR* argv[])
{
DWORD strlen = 0;
char szFrom[] = "C:\\Temp",
szTo[] = "C:\\Sample.zip";
HRESULT hResult;
IShellDispatch *pISD;
Folder *pToFolder = NULL;
VARIANT vDir, vFile, vOpt;
BSTR strptr1, strptr2;
CoInitialize(NULL);
hResult = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pISD);
if (SUCCEEDED(hResult) && pISD != NULL)
{
strlen = MultiByteToWideChar(CP_ACP, 0, szTo, -1, 0, 0);
strptr1 = SysAllocStringLen(0, strlen);
MultiByteToWideChar(CP_ACP, 0, szTo, -1, strptr1, strlen);
VariantInit(&vDir);
vDir.vt = VT_BSTR;
vDir.bstrVal = strptr1;
hResult = pISD->NameSpace(vDir, &pToFolder);
if (SUCCEEDED(hResult))
{
strlen = MultiByteToWideChar(CP_ACP, 0, szFrom, -1, 0, 0);
strptr2 = SysAllocStringLen(0, strlen);
MultiByteToWideChar(CP_ACP, 0, szFrom, -1, strptr2, strlen);
VariantInit(&vFile);
vFile.vt = VT_BSTR;
vFile.bstrVal = strptr2;
VariantInit(&vOpt);
vOpt.vt = VT_I4;
vOpt.lVal = 4; // Do not display a progress dialog box
hResult = NULL;
printf("Copying %s to %s ...\n", szFrom, szTo);
hResult = pToFolder->CopyHere(vFile, vOpt); //NOTE: this appears to always return S_OK even on error
/*
* 1) Enumerate current threads in the process using Thread32First/Thread32Next
* 2) Start the operation
* 3) Enumerate the threads again
* 4) Wait for any new threads using WaitForMultipleObjects
*
* Of course, if the operation creates any new threads that don't exit, then you have a problem.
*/
if (hResult == S_OK) {
//NOTE: hard-coded for testing - be sure not to overflow the array if > 5 threads exist
HANDLE hThrd[5];
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPALL ,0); //TH32CS_SNAPMODULE, 0);
DWORD NUM_THREADS = 0;
if (h != INVALID_HANDLE_VALUE) {
THREADENTRY32 te;
te.dwSize = sizeof(te);
if (Thread32First(h, &te)) {
do {
if (te.dwSize >= (FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(te.th32OwnerProcessID)) ) {
//only enumerate threads that are called by this process and not the main thread
if((te.th32OwnerProcessID == GetCurrentProcessId()) && (te.th32ThreadID != GetCurrentThreadId()) ){
//printf("Process 0x%04x Thread 0x%04x\n", te.th32OwnerProcessID, te.th32ThreadID);
hThrd[NUM_THREADS] = OpenThread(THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);
NUM_THREADS++;
}
}
te.dwSize = sizeof(te);
} while (Thread32Next(h, &te));
}
CloseHandle(h);
printf("waiting for all threads to exit...\n");
//Wait for all threads to exit
WaitForMultipleObjects(NUM_THREADS, hThrd , TRUE , INFINITE);
//Close All handles
for ( DWORD i = 0; i < NUM_THREADS ; i++ ){
CloseHandle( hThrd[i] );
}
} //if invalid handle
} //if CopyHere() hResult is S_OK
SysFreeString(strptr2);
pToFolder->Release();
}
SysFreeString(strptr1);
pISD->Release();
}
CoUninitialize();
printf ("Press ENTER to exit\n");
getchar();
return 0;
}
決定していないこのルートもくセミの機能コードの後に更に調査され、フォルダ::CopyHere()メソッドは実行を尊重し、vOptionsに渡されることはできませんで上書きファイルは表示されないエラーダイアログのユーザーです。
光、どうしたらいいでしょうか試みたXZip図書館によるポスターです。このライブラリの機能美を作成するZipアーカイブでのZipAdd()関数の呼び出されZIP_FOLDERは再帰的で単に作成フォルダのアーカイブを展開します。のための再帰的にzipアーカイブにお使いこなせるよう、最低限必要なのAddFolderContent()機能です。例えば、C:\Sample.zip を追加しますC: emp フォルダには、下記の利用:
HZIP newZip = CreateZip("C:\\Sample.zip", NULL, ZIP_FILENAME);
BOOL retval = AddFolderContent(newZip, "C:", "temp");
重要な注意:のAddFolderContent()関数ではない機能としてのXZip図書館があります。まrecurseのディレクトリ構造が失敗したに追加ファイルをzipアーカイブにより、バグのパスに渡されるZipAdd().ため、この機能を利用する必要がありま編集を変更す:
if (ZipAdd(hZip, RelativePathNewFileFound, RelativePathNewFileFound, 0, ZIP_FILENAME) != ZR_OK)
以下の
ZRESULT ret;
TCHAR real_path[MAX_PATH] = {0};
_tcscat(real_path, AbsolutePath);
_tcscat(real_path, RelativePathNewFileFound);
if (ZipAdd(hZip, RelativePathNewFileFound, real_path, 0, ZIP_FILENAME) != ZR_OK)
を使用していまXZipます。ここで、C++ソースコードを作ります。
上記のコードを空にzipファイルが壊れるとのコメント状態が得られます。開空zipは、六角レンチをエディタ、数。ここでは私の修正例:
FILE* f = fopen("path", "wb");
fwrite("\x50\x4B\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 22, 1, f);
fclose(f);
このためでした。したがその後の圧縮フォルダにまとめた。試していない第3者のアプリなど、winzip.
迅速に検索したこのサイト: http://www.example-code.com/vcpp/vcUnzip.asp は非常に短い例を解凍ファイルをダウンロード図書館があります。たくさんありその他の図書館可能です。例えば、availaibleコードプロジェクトを受 Zip、解凍し、MFCの方 る全体のguiの一例です。だいたいです。純しいので、アクシステム。圧縮。
また、7-Zip libarary http://www.7-zip.org/sdk.html.この源泉数、言語や例です。
るとは思いませんMFCは、Windows標準のC/C++のApiインターフェースを提供しますのでzip可能です。
き常に静的にリンクをフリーウェアのzip図書館にない場合には船舶の他の図書館...