利用第三方 XUnzip 封装实现解压函数。
MyUnZip.h文件
1 | /* 防止多次包含 */ |
2 |
3 | #ifndef MYUNZIP_H_ |
4 | #define MYUNZIP_H_ |
5 |
6 | #include "XUnzip.h" |
7 | #include <afxwin.h> |
8 | #include <vector> |
9 |
10 | #ifdef _UNICODE |
11 | #define MyUnZip MyUnZipW |
12 |
13 | /* UNICODE版本 */ |
14 | std::vector<CString> & MyUnZipW (CString szPathAndFileName, CString szUnZipPath = _T( "" )); |
15 |
16 | #else |
17 | #define MyUnZip MyUnZipA |
18 |
19 | /* ANSCII版本 */ |
20 | std::vector<CString> & MyUnZipA (CString szPathAndFileName, CString szUnZipPath = "" ); |
21 |
22 | #endif |
23 |
24 | /****************************************************************** |
25 | |--函数功能: |
26 | |-- 解压zip压缩包到指定路径 |
27 | |-- |
28 | |--输入参数: |
29 | |-- szPathAndFileName: 待解压 zip压缩包所在文件夹路径和zip压缩名称; 如"D://00//1.zip" |
30 | |-- szUnZipPath: 解压出来的文件 所存放的问价完整路径; 如 “D://01” |
31 | |-- 此参数省略时,默认解压到exe程序所在文件夹下的 Skin文件 |
32 | |-- |
33 | |--返回值: |
34 | |-- 解压出来所有文件的完整路径 |
35 | ******************************************************************/ |
36 |
37 | #endif |
MyUnZip.cpp文件
1 | #include "stdafx.h" |
2 | #include "MyUnZip.h" |
3 |
4 | std::vector<CString> & MyUnZipW (CString szPathAndFileName, CString szUnZipPath) |
5 | { |
6 | static std::vector<CString> szFilePath; |
7 | #ifdef _UNICODE |
8 | WCHAR buffer[248]; |
9 |
10 | if (szUnZipPath != L "" ) |
11 | { |
12 | /* 如果文件路径不存在 先创建,存在 不做任何修改 */ |
13 | SHCreateDirectoryEx(NULL, szUnZipPath, NULL); |
14 | } |
15 | else |
16 | { |
17 | GetCurrentDirectory(248, ( LPWSTR )&buffer); |
18 | szUnZipPath = buffer; |
19 | szUnZipPath += L "\\Skin" ; |
20 | SHCreateDirectoryEx(NULL, szUnZipPath, NULL); |
21 | } |
22 |
23 | HZIP hz=OpenZip( ( void *)( LPTSTR )( LPCTSTR )szPathAndFileName, 0, ZIP_FILENAME); |
24 | ZIPENTRYW ze; |
25 | GetZipItem(hz, -1, &ze); |
26 | int numitems=ze.index; |
27 |
28 | for ( int zi=0; zi<numitems; zi++) |
29 | { |
30 | ZIPENTRYW ze; GetZipItem(hz,zi,&ze); |
31 | UnzipItem(hz, zi, ( void *)( LPTSTR )( LPCTSTR )(szUnZipPath+L "\\" +ze.name), 0,ZIP_FILENAME); |
32 | szFilePath.push_back(szUnZipPath+L "\\" +ze.name); |
33 | } |
34 |
35 | CloseZip(hz); |
36 | #endif |
37 | return szFilePath; |
38 | } |
39 |
40 | std::vector<CString> & MyUnZipA (CString szPathAndFileName, CString szUnZipPath) |
41 | { |
42 |
43 | static std::vector<CString> szFilePath; |
44 | #ifndef _UNICODE |
45 |
46 | char buffer[248]; |
47 | if (szUnZipPath != "" ) |
48 | { |
49 | /* 如果文件路径不存在 先创建,存在 不做任何修改 */ |
50 | SHCreateDirectoryEx(NULL, szUnZipPath, NULL); |
51 | } |
52 | else |
53 | { |
54 | GetCurrentDirectory(248, ( LPSTR )&buffer); |
55 | szUnZipPath = buffer; |
56 | szUnZipPath += "\\Skin" ; |
57 | SHCreateDirectoryEx(NULL, szUnZipPath, NULL); |
58 | } |
59 |
60 | HZIP hz=OpenZip( ( void *)( LPTSTR )( LPCTSTR )szPathAndFileName, 0, ZIP_FILENAME); |
61 | ZIPENTRY ze; |
62 | GetZipItem(hz, -1, &ze); |
63 | int numitems=ze.index; |
64 |
65 | for ( int zi=0; zi<numitems; zi++) |
66 | { |
67 | ZIPENTRY ze; GetZipItem(hz,zi,&ze); |
68 | UnzipItem(hz, zi, ( void *)( LPTSTR )( LPCTSTR )(szUnZipPath+ "\\" +ze.name), 0,ZIP_FILENAME); |
69 | szFilePath.push_back(szUnZipPath+ "\\" +ze.name); |
70 | } |
71 |
72 | CloseZip(hz); |
73 | #endif |
74 | return szFilePath; |
75 | } |
说明:经测试发现XUnzip 中对于路径的处理不是很好,所以根据需要,可以自行修改XUnzip.h、XUnzip.cpp文件来完善路径的处理。代码下载