C++ 在C/C+中的Windows(XP/2003)上创建ZIP文件+;

C++ 在C/C+中的Windows(XP/2003)上创建ZIP文件+;,c++,winapi,zip,C++,Winapi,Zip,我正在寻找一种从WindowsC/C++API中的文件夹创建ZIP文件的方法。我可以使用Shell32.Application CopyHere方法在VBScript中找到实现这一点的方法,并且我还找到了一个教程,解释了如何在C#中实现这一点,但是对于C API没有任何说明(C++也很好,project已经使用MFC) 如果有人能分享一些能在WindowsXP/2003上成功创建zip文件的C代码示例,我将不胜感激。如果有人找不到可靠的文档或教程,那就太好了,因为MSDN搜索结果不多。我真的希望

我正在寻找一种从WindowsC/C++API中的文件夹创建ZIP文件的方法。我可以使用Shell32.Application CopyHere方法在VBScript中找到实现这一点的方法,并且我还找到了一个教程,解释了如何在C#中实现这一点,但是对于C API没有任何说明(C++也很好,project已经使用MFC)


如果有人能分享一些能在WindowsXP/2003上成功创建zip文件的C代码示例,我将不胜感激。如果有人找不到可靠的文档或教程,那就太好了,因为MSDN搜索结果不多。我真的希望不必为此提供第三方lib,因为功能显然在那里,我只是不知道如何访问它。谷歌搜索没有发现任何有用的东西,只是诱人的零碎信息。这里希望社区中有人能整理出这一点,并能与子孙后代分享

我不认为MFC或Windows标准C/C++API提供了内置zip功能的接口。

编辑:这个答案很旧,但我无法删除,因为它已被接受。看到下一个了吗

-----原始答案-----

这里有这样做的示例代码

[编辑:链接现在已断开]

请确保您阅读了有关如何处理要完成的线程监视的内容

编辑:从注释中可以看出,此代码仅适用于现有的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库。

一个快速的谷歌搜索出现了这个网站:它有一个非常简短的例子,可以使用可下载的库解压缩文件。还有很多其他可用的图书馆。另一个例子可以在名为的代码项目中找到,它有一个完整的gui例子。如果你想用.NET来做,那么在System.Compression下总是有类的


还有7拉链的图书馆。这包括几种语言的源代码和示例。

为此,我们使用XZip。它是免费的,它是C++源代码,工作很好。p>

如评论中其他地方所述,这只适用于已创建的Zip文件。zip文件中也必须不存在该内容,否则将显示错误。下面是我能够根据接受的答案创建的工作示例代码。您需要链接到shell32.lib和kernel32.lib(用于CreateToolhelp32Snapshot)

重要提示:AddFolderContent()函数没有XZip库中包含的功能。它将递归到目录结构中,但由于传递到Zipad()的路径中存在错误,因此无法将任何文件添加到zip存档中。要使用此功能,您需要编辑源并更改此行:

if (ZipAdd(hZip, RelativePathNewFileFound, RelativePathNewFileFound, 0, ZIP_FILENAME) != ZR_OK)
对下列事项:

HZIP newZip = CreateZip("C:\\Sample.zip", NULL, ZIP_FILENAME);
BOOL retval = AddFolderContent(newZip, "C:", "temp");
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)

如上所述,创建空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);

这对我有用。然后我可以打开压缩文件夹。未使用第三方应用程序(如winzip)进行测试。

我在前面确实找到了该示例代码,但它实际上似乎无法正常工作。经过一些调整后,我最终让它编译并运行了起来,并且它可以正常工作,前提是ZIP文件已经存在。如果没有人提出一个更完整的答案,我会接受这个。创建空白zip:文件*f= fOpen[“路径”,“WB”);写入(“\x80\x75\x05\x06\0\0\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软件(包括winzip、Windows内置zip、OS X上的BOMArchiver或命令行上的unzip)都无法打开它。具体来说,此注释中的代码链接已断开。最好将答案的要点放在此处,而不仅仅是链接。如何使用Win32 API在Windows中创建压缩文件夹:您可以使用C或C++中的Shell 32.CopyScript,只需调用必要的Win32 API来实例化COM对象。没有更聪明的方法来检测仍然工作的shell吗?[要以自定义间隔检查打开的shell窗口f.e.?此代码有效,但如果线程在此行之前已完成,则函数
WaitForMultipleObjects
wait infinity。根据msdn文档=>它说
如果在等待仍处于挂起状态时关闭其中一个句柄,则函数的行为未定义。
为了避免这种情况,句柄必须只有SYNCHRONIZE access right标志。因此,在
OpenThread(THREAD\u ALL\u access,FALSE,te.th32ThreadID);
中替换
THREAD\u access
,就可以了!
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);