解压缩功能的实现--使用XZip与XUnzip
2015-11-07 11:47
567 查看
使用的XZip版本1.3 源程序可在Codeproject上获得,本教程实例代码下载
建立基于对话框的MFC程序(XZip是不依赖MFC)
添加XZip到项目,并添加头文件引用,至此可以使用XZip。
在编译的时候,若有报错如下:
对XUnzip.cpp与XZip不适用预编译头
重新编译,无报错。
几个常用函数简介:
CreateZip()--创建压缩文件。
// Purpose: Create a zip archive file//// Parameters: z - archive file name if flags is ZIP_FILENAME; for other// uses see below// len - for memory (ZIP_MEMORY) should be the buffer size;//
for other uses, should be 0// flags - indicates usage, see below; for files, this will be// ZIP_FILENAME//// Returns: HZIP - non-zero if zip archive created ok, otherwise 0
调用CreateZip来创建一个压缩文件,在创建压缩文件的时候,根据flags来判断文件存储位置
管道中:CreateZip(hpip_write,0,ZIP_HANDLE);
文件中(根据文件句柄):CreateZip(hfile, 0,ZIP_HANDLE);
文件中(文件路径):CreateZip("c:\\test.zip", 0,ZIP_FILENAME);
内存中:CreateZip(buf, len,ZIP_MEMORY);
页面文件:CreateZip(0, len,ZIP_MEMORY);
ZipAdd()--在压缩文件中添加文件
// ZipAdd()
//
// Purpose: Add a file to a zip archive
//
// Parameters: hz - handle to an open zip archive
// dstzn - name used inside the zip archive to identify the file
// src - for a file (ZIP_FILENAME) this specifies the filename
// to be added to the archive; for other uses, see below
// len - for memory (ZIP_MEMORY) this specifies the buffer
// length; for other uses, this should be 0
// flags - indicates usage, see below; for files, this will be
// ZIP_FILENAME
//
// Returns: ZRESULT - ZR_OK if success, otherwise some other value
每一个需要添加进hz的文件都需要调用ZipAdd();
dstzn存在hz中的文件的名字。被加到hz中的文件可以从管道中来:ZipAdd(hz,"file.dat", hpipe_read,0,ZIP_HANDLE);
从文件(文件句柄)中来: ZipAdd(hz,"file.dat", hfile,0,ZIP_HANDLE);
从文件(路径)中来:ZipAdd(hz,"file.dat", "c:\\docs\\origfile.dat",0,ZIP_FILENAME);
从内存中来: ZipAdd(hz,"subdir\\file.dat", buf,len,ZIP_MEMORY);
或者添加文件夹:ZipAdd(hz,"subdir", 0,0,ZIP_FOLDER);
打开zip文件--OpenZip()
// OpenZip()
//
// Purpose: Open an existing zip archive file
//
// Parameters: z - archive file name if flags is ZIP_FILENAME; for other
// uses see below
// len - for memory (ZIP_MEMORY) should be the buffer size;
// for other uses, should be 0
// flags - indicates usage, see below; for files, this will be
// ZIP_FILENAME
//
// Returns: HZIP - non-zero if zip archive opened ok, otherwise 0
// OpenZip - opens a zip file and returns a handle with which you can
// subsequently examine its contents. You can open a zip file from:
// from a pipe: OpenZip(hpipe_read,0, ZIP_HANDLE);
// from a file (by handle): OpenZip(hfile,0, ZIP_HANDLE);
// from a file (by name): OpenZip("c:\\test.zip",0, ZIP_FILENAME);
// from a memory block: OpenZip(bufstart, buflen, ZIP_MEMORY);
// If the file is opened through a pipe, then items may only be
// accessed in increasing order, and an item may only be unzipped once,
// although GetZipItem can be called immediately before and after unzipping
// it. If it's opened i n any other way, then full random access is possible.
// Note: pipe input is not yet implemented.
GetZipItem() - Get information about an item in an open zip archive.
FindZipItem() - Find item by name and return information about it.
UnzipItem() - Find item by index and unzip it.
关闭zip文件--CloseZip();
在实例中,演示压缩指定文件夹里的所有文件。
简易界面:
添加文件代码:
建立基于对话框的MFC程序(XZip是不依赖MFC)
添加XZip到项目,并添加头文件引用,至此可以使用XZip。
在编译的时候,若有报错如下:
对XUnzip.cpp与XZip不适用预编译头
重新编译,无报错。
几个常用函数简介:
CreateZip()--创建压缩文件。
<pre class="cpp" name="code">HZIP CreateZip(void *z, unsigned int len, DWORD flags);
// Purpose: Create a zip archive file//// Parameters: z - archive file name if flags is ZIP_FILENAME; for other// uses see below// len - for memory (ZIP_MEMORY) should be the buffer size;//
for other uses, should be 0// flags - indicates usage, see below; for files, this will be// ZIP_FILENAME//// Returns: HZIP - non-zero if zip archive created ok, otherwise 0
调用CreateZip来创建一个压缩文件,在创建压缩文件的时候,根据flags来判断文件存储位置
管道中:CreateZip(hpip_write,0,ZIP_HANDLE);
文件中(根据文件句柄):CreateZip(hfile, 0,ZIP_HANDLE);
文件中(文件路径):CreateZip("c:\\test.zip", 0,ZIP_FILENAME);
内存中:CreateZip(buf, len,ZIP_MEMORY);
页面文件:CreateZip(0, len,ZIP_MEMORY);
ZipAdd()--在压缩文件中添加文件
ZRESULT ZipAdd(HZIP hz, const TCHAR *dstzn, void *src, unsigned int len, DWORD flags);
// ZipAdd()
//
// Purpose: Add a file to a zip archive
//
// Parameters: hz - handle to an open zip archive
// dstzn - name used inside the zip archive to identify the file
// src - for a file (ZIP_FILENAME) this specifies the filename
// to be added to the archive; for other uses, see below
// len - for memory (ZIP_MEMORY) this specifies the buffer
// length; for other uses, this should be 0
// flags - indicates usage, see below; for files, this will be
// ZIP_FILENAME
//
// Returns: ZRESULT - ZR_OK if success, otherwise some other value
每一个需要添加进hz的文件都需要调用ZipAdd();
dstzn存在hz中的文件的名字。被加到hz中的文件可以从管道中来:ZipAdd(hz,"file.dat", hpipe_read,0,ZIP_HANDLE);
从文件(文件句柄)中来: ZipAdd(hz,"file.dat", hfile,0,ZIP_HANDLE);
从文件(路径)中来:ZipAdd(hz,"file.dat", "c:\\docs\\origfile.dat",0,ZIP_FILENAME);
从内存中来: ZipAdd(hz,"subdir\\file.dat", buf,len,ZIP_MEMORY);
或者添加文件夹:ZipAdd(hz,"subdir", 0,0,ZIP_FOLDER);
打开zip文件--OpenZip()
HZIP OpenZip(void *z, unsigned int len, DWORD flags);
// OpenZip()
//
// Purpose: Open an existing zip archive file
//
// Parameters: z - archive file name if flags is ZIP_FILENAME; for other
// uses see below
// len - for memory (ZIP_MEMORY) should be the buffer size;
// for other uses, should be 0
// flags - indicates usage, see below; for files, this will be
// ZIP_FILENAME
//
// Returns: HZIP - non-zero if zip archive opened ok, otherwise 0
// OpenZip - opens a zip file and returns a handle with which you can
// subsequently examine its contents. You can open a zip file from:
// from a pipe: OpenZip(hpipe_read,0, ZIP_HANDLE);
// from a file (by handle): OpenZip(hfile,0, ZIP_HANDLE);
// from a file (by name): OpenZip("c:\\test.zip",0, ZIP_FILENAME);
// from a memory block: OpenZip(bufstart, buflen, ZIP_MEMORY);
// If the file is opened through a pipe, then items may only be
// accessed in increasing order, and an item may only be unzipped once,
// although GetZipItem can be called immediately before and after unzipping
// it. If it's opened i n any other way, then full random access is possible.
// Note: pipe input is not yet implemented.
GetZipItem() - Get information about an item in an open zip archive.
////////////////////////////////////////////////////////////////////////////// // // GetZipItem() // // Purpose: Get information about an item in an open zip archive // // Parameters: hz - handle of open zip archive // index - index number (0 based) of item in zip // ze - pointer to a ZIPENTRY (if ANSI) or ZIPENTRYW struct // (if Unicode) // // Returns: ZRESULT - ZR_OK if success, otherwise some other value //
FindZipItem() - Find item by name and return information about it.
////////////////////////////////////////////////////////////////////////////// // // FindZipItem() // // Purpose: Find item by name and return information about it // // Parameters: hz - handle of open zip archive // name - name of file to look for inside zip archive // ic - TRUE = case insensitive // index - pointer to index number returned, or -1 // ze - pointer to a ZIPENTRY (if ANSI) or ZIPENTRYW struct // (if Unicode) // // Returns: ZRESULT - ZR_OK if success, otherwise some other value //
UnzipItem() - Find item by index and unzip it.
////////////////////////////////////////////////////////////////////////////// // // UnzipItem() // // Purpose: Find item by index and unzip it // // Parameters: hz - handle of open zip archive // index - index number of file to unzip // dst - target file name of unzipped file // len - for memory (ZIP_MEMORY. length of buffer; // otherwise 0 // flags - indicates usage, see below; for files, this will be // ZIP_FILENAME // // Returns: ZRESULT - ZR_OK if success, otherwise some other value //
关闭zip文件--CloseZip();
ZRESULT CloseZip(HZIP hz);
在实例中,演示压缩指定文件夹里的所有文件。
简易界面:
添加文件代码:
void CXzippppDlg::OnBnClickedBtnAddpath() { // TODO: 在此添加控件通知处理程序代码 TCHAR szPath[MAX_PATH]; //存放选择的目录路径 m_edit_show=_T(""); ZeroMemory(szPath, sizeof(szPath)); BROWSEINFO bi; bi.hwndOwner = m_hWnd; bi.pidlRoot = NULL; bi.pszDisplayName = szPath; bi.lpszTitle = L"选择需要添加的文件目录"; bi.ulFlags = 0; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; //弹出选择目录对话框 LPITEMIDLIST lp = SHBrowseForFolder(&bi); if(lp && SHGetPathFromIDList(lp, szPath)) { m_edit_show.Format(L"已选择目录 %s", szPath); m_strPath=szPath; } else AfxMessageBox(L"无效的目录,请重新选择"); UpdateData(FALSE); }压缩文件代码:
oid CXzippppDlg::OnBnClickedBtnZip() { // TODO: 在此添加控件通知处理程序代码 if (m_strPath==_T("")) { AfxMessageBox(L"请选择有效的路径"); return; } //1.创建zip HZIP hz=CreateZip(L"C:\\test.zip",0,ZIP_FILENAME);// //2.添加文件 if (hz) { //ZipAdd(hz,m_strPath,0,0,ZIP_FOLDER); //遍历路径下所有文件和文件夹。 ZipAllFile(m_strPath,hz); } CloseZip(hz); }
void CXzippppDlg::ZipAllFile(CString strDir,HZIP hz) {//可以在线程中实现,不然压缩大文件时,主程序要等待 if(strDir == _T("")) return; else { if(strDir.Right(1) != _T("\\")) strDir += L"\\"; strDir =strDir+_T("*.*"); } CFileFind finder; CString strPath; BOOL bWorking = finder.FindFile(strDir); while(bWorking) { bWorking = finder.FindNextFile(); strPath = finder.GetFilePath(); if(finder.IsDirectory() && !finder.IsDots()) { // CString pathname=strPath.Mid(strPath.ReverseFind('\\')+1); //ZipAdd(hz,pathname,0,0,ZIP_FOLDER); ZipAllFile(strPath,hz); //递归调用 } else if(!finder.IsDirectory() && !finder.IsDots()) { //strPah就是所要获取的文件路径 CString filename=strPath.Mid(strPath.ReverseFind('\\')+1); ZipAdd(hz, filename, strPath.GetBuffer(), 0, ZIP_FILENAME); } } }压缩功能做好后,还有解压功能暂时没做。
相关文章推荐
- ListView 和 GridView的OnItemClickListener()失效的又一种可能
- jquery UI Datepicker时间控件的使用方法(终结版)
- (转)hibernate.cfg.xml:The file cannot be validated as there was a connection problem
- Linux压缩与归档
- Android数据库(二)之创建表和LitePal的基本用法
- TableView的优化
- 矩母函数
- 如何查看LINUX下的一个USB设备使用的驱动模块
- 转:关于android webview实践的文章集合
- NSString字符串判断以某个str开头或者以某个str结尾
- iOS(2)-内存管理
- NSURLSession简介
- MyTalkStuffHomeIcon-2
- Scala数据库编程
- 安全参透之旅第3章 Websploit工具
- 【C#】获取系统信息
- Swift 进阶
- 一起talk C栗子吧(第五十九回:C语言实例--字符串概述)
- Android数据库(一)之SQLite命令
- UGUI 图片去色,取灰色