⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compress.cpp

📁 PocketPC上很好用的文件管理器,而且里面的封装性很好,学windows mobile开发的兄弟,值得一看
💻 CPP
字号:
///////////////////////////////////////////////////////////////
//Compress.cpp
//僼傽僀儖埑弅/夝搥

///////////////////////////////////////////////////////////////
//INCLUDE
#include "GSFinder.h"
#include "ListView.h"
#include "Compress.h"

////////////////////////////////////////////////////////////////
BOOL MakeSureDirectoryPathExists(LPTSTR DirPath)
{

	LPTSTR lpszTerm = (LPTSTR)DirPath;
	do {
		
		//僷僗偺嬫愗傝暥帤(\)傪扵偡
		lpszTerm = wcschr(lpszTerm+1, _T('\\'));
		if (lpszTerm) {

			//嬫愗傝傑偱偺暥帤傪僐僺乕
			TCHAR szPath[MAX_PATH];
			*lpszTerm = 0;
			wsprintf(szPath, _T("%s"), DirPath); 
			*lpszTerm = _T('\\');
			
			//僨傿儗僋僩儕偑側偄応崌偼嶌惉偡傞
			if (GetFileAttributes(szPath) == 0xFFFFFFFF) {
				if (!CreateDirectory(szPath, NULL)) {
					return FALSE;
				}
			}
		}

	} while(lpszTerm); //End of do
	
	return TRUE;
}

////////////////////////////////////////////////////////////////
CCompress::CCompress()
{
	HMODULE hDLL=0;

	//LHA偺僆乕僾儞
	m_bLhaChk = FALSE;
	hDLL = OpenDLL(COMPDLL_MODE_LHA);
	if(hDLL)
	{
		m_bLhaChk =TRUE;
		//LHA偺僋儘乕僘
		CloseDLL(hDLL);
	}

	//ZIP偺僆乕僾儞
	m_bZipChk = FALSE;
	hDLL = OpenDLL(COMPDLL_MODE_ZIP);
	if(hDLL)
	{
		m_bZipChk =TRUE;
		//ZIP偺僋儘乕僘
		CloseDLL(hDLL);
	}
}

////////////////////////////////////////////////////////////////
CCompress::~CCompress()
{
}

////////////////////////////////////////////////////////////////
HMODULE CCompress::OpenDLL(int nMode)
{
	//埑弅.夝搥DLL偺儘乕僪
    HMODULE hDLL = ::LoadLibrary(
		nMode==COMPDLL_MODE_LHA?_T("unlha.dll"):_T("unzip.dll"));
	
	if(!hDLL)
	{
		return 0;
	}
	return hDLL;
}

////////////////////////////////////////////////////////////////
void CCompress::CloseDLL(HMODULE hDLL)
{
	//埑弅.夝搥DLL偺僼儕乕
	if(hDLL)
		::FreeLibrary(hDLL);
}

////////////////////////////////////////////////////////////////
int CCompress::ExLha(LPTSTR lpszCmdLine)
{
	//僾儘僌儔儉僷僗偐傜僇儗儞僩僷僗偺庢摼
	TCHAR szPath[MAX_PATH];
	GetModuleFileName(NULL, szPath, sizeof(szPath));
	LPTSTR lpszTemp = wcsrchr(szPath, _T('\\'));
	if (lpszTemp) *lpszTemp = 0x00;

	//幚峴僼傽僀儖柤嶌惉
	TCHAR szProc[MAX_PATH];
	wsprintf(szProc, _T("%s\\exLha.exe"), szPath);

	//幚峴僼傽僀儖偑懚嵼偡傞応崌
	if (GetFileAttributes(szProc) != 0xFFFFFFFF)
	{
		//僟僽儖僋僅乕僥乕僔儑儞偺晅梌
		TCHAR szParam[1024];
		wsprintf(szParam, _T("\"%s\""), lpszCmdLine);

		//僾儘僙僗偺惗惉
		STARTUPINFO info;
		PROCESS_INFORMATION pinfo;
		memset(&info, 0x00, sizeof(info));
		info.cb = sizeof(info);
		info.wShowWindow = SW_SHOWNORMAL;	
		if(CreateProcess(szProc,szParam,NULL,NULL,FALSE,0,NULL,NULL,&info,&pinfo))
		{
			//僾儘僌儔儉偺廔椆懸偪
			WaitForSingleObject(pinfo.hProcess, INFINITE);
			return 1;
		}
	}

	//幚峴晄壜偺応崌
	return 0;
}

////////////////////////////////////////////////////////////////
BOOL CCompress::RunCompress(
	LPTSTR			lpszCurrentFolder,
	LPTSTR			lpszFileName,
	DWORD			nCompDLL,
	BOOL			bMoveDir)
{
	TCHAR szOutBuf[1024];
	TCHAR szSaveFile[MAX_PATH];
	TCHAR szExtName[16];

	if(wcslen(lpszFileName) == 0) return FALSE;

	//埑弅僼傽僀儖柤庢摼
	memset(szSaveFile, 0x00, sizeof(szSaveFile));
	lstrcpy(szExtName, nCompDLL==COMPDLL_MODE_LHA?_T("lzh"):_T("zip"));

	//埑弅僼傽僀儖梡僟僀傾儘僌愝掕
	OPENFILENAME ofn;
	memset(&ofn, 0x00, sizeof(ofn));
	ofn.lStructSize		= sizeof(ofn);
	ofn.hwndOwner		= g_MainWnd.m_hWnd;
	ofn.lpstrFile		= szSaveFile;
	ofn.lpstrInitialDir	= lpszCurrentFolder;
	ofn.nMaxFile		= sizeof(szSaveFile)/sizeof(TCHAR);
	ofn.lpstrDefExt		= szExtName;
	ofn.Flags			= OFN_LONGNAMES | OFN_OVERWRITEPROMPT;
	ofn.lpfnHook		= NULL;
	ofn.lpstrTitle		= IDS_TITLE_COMPDLG;
	ofn.lpstrFilter		= 
		(nCompDLL==COMPDLL_MODE_LHA?IDS_FILTER_COMPDLG1:IDS_FILTER_COMPDLG2);

	//曐懚僟僀傾儘僌僆乕僾儞
	BOOL (*gsGetSaveFileName)(OPENFILENAME*) = NULL;
	HINSTANCE hInst = LoadLibrary(_T("gsgetfile.dll"));
	if (hInst) {
		(FARPROC&)gsGetSaveFileName = GetProcAddress(hInst, _T("gsGetSaveFileName"));
	}
#if __POCKET_PC
	else
		ofn.lpstrInitialDir	= NULL;
#endif

	BOOL fRet;
	if (gsGetSaveFileName)
		fRet = gsGetSaveFileName(&ofn);
	else
		fRet = GetSaveFileName(&ofn);

	if (hInst) FreeLibrary(hInst);
	if (!fRet) return FALSE;

	//儊儌儕妉摼
	int nLen = 16 + wcslen(szSaveFile) + wcslen(lpszCurrentFolder) + wcslen(lpszFileName);
	LPTSTR lpszCmdLine = new TCHAR[nLen+1];
	memset(lpszCmdLine, 0x00, sizeof(TCHAR)*(nLen+1));

	//僐儅儞僪儔僀儞嶌惉
	wsprintf(lpszCmdLine, _T("a \"%s\" \"%s\\\" %s"),
					szSaveFile, lpszCurrentFolder, lpszFileName);	

	//DLL偺儘乕僪
	HMODULE hDLL = OpenDLL(nCompDLL);
	if(!hDLL)
	{
		MessageBox(g_MainWnd.m_hWnd,
			(nCompDLL==COMPDLL_MODE_LHA?IDS_MSG_COMPERROR1:IDS_MSG_COMPERROR2),
			NULL, MB_OK|MB_ICONSTOP);
		
		return FALSE;
	}

	//僼傽僀儖埑弅(堦帪僼傽僀儖嶌惉)
	memset(szOutBuf, 0x00, sizeof(szOutBuf));
	UNFUNC unXX = (UNFUNC)::GetProcAddress(hDLL, nCompDLL==COMPDLL_MODE_LHA?_T("Unlha"):_T("UnZip"));
	if(unXX)
	{
		//DLL偺屇傃弌偟
		int ret = (*unXX)(NULL, lpszCmdLine, szOutBuf, sizeof(szOutBuf));

		//DLL偺僋儘乕僘
		CloseDLL(hDLL);

		if(ret != 0)
		{
			TCHAR szBuf[1024];
			wsprintf(szBuf,IDS_MSG_COMPERROR3, szOutBuf);
			MessageBox(g_MainWnd.m_hWnd, szBuf, NULL, MB_OK|MB_ICONSTOP);
			return FALSE;
		}
	}

	//奿擺愭傊堏摦
	if(bMoveDir)
	{
		//僷僗偺嬫愗傝暥帤(\)傪扵偡
		LPTSTR lpszTerm = wcsrchr(szSaveFile, _T('\\'));
		if (lpszTerm) {
			*(lpszTerm) = 0;
			g_MainWnd.m_ListView.LoadFolderItem(szSaveFile);
		}
	}

	//儊儌儕夝曻
	delete[] lpszCmdLine;

	//惓忢廔椆
	return TRUE;
}

////////////////////////////////////////////////////////////////
BOOL CCompress::OnFileCompress(
		LPTSTR						szCurrentFolder,
		int							nCount,
		struct _tagListItemInfo*	pliinfo,
		DWORD						nCompDLL,
		BOOL						bMoveDir,
		BOOL						bAutoUnComp,
		LPTSTR						szEditPath)
{
	//傾僀僥儉暿偺僒僀僘庢摼
	int nLen=0;
	int cnt;
	for(cnt=0; cnt<nCount; cnt++)
	{
		//懳徾僼傽僀儖偺儕僗僩嶌惉
		//僨傿儗僋僩儕偺応崌
		if (pliinfo[cnt].nItem & LIST_ITEM_FOLDER)
		{
			nLen += (6 + wcslen(pliinfo[cnt].szPath) + wcslen(pliinfo[cnt].szName));
		}
		//僼傽僀儖偺応崌
		else if (pliinfo[cnt].nItem & LIST_ITEM_FILE)
		{
			nLen += (4 + wcslen(pliinfo[cnt].szPath) + wcslen(pliinfo[cnt].szName));
		}
	
	} //End of for

	//儊儌儕妉摼
	LPTSTR lpszPath = new TCHAR[nLen+1];
	memset(lpszPath, 0x00, sizeof(TCHAR)*(nLen+1));

	//傾僀僥儉暿偺張棟幚峴
	for(cnt=0; cnt<nCount; cnt++)
	{
		//懚嵼僠僃僢僋
		TCHAR szTemp[MAX_PATH];
		wsprintf(szTemp, _T("%s\\%s"), pliinfo[cnt].szPath, pliinfo[cnt].szName);
		
		//僄儔乕帪
		if (GetFileAttributes(szTemp) == 0xFFFFFFFF) continue;
		
		//懳徾僼傽僀儖偺儕僗僩嶌惉
		//僨傿儗僋僩儕偺応崌
		if (pliinfo[cnt].nItem & LIST_ITEM_FOLDER)
		{
			wsprintf(szTemp, _T("\"%s\\%s\\*\" "), pliinfo[cnt].szPath, pliinfo[cnt].szName);
			lstrcat(lpszPath, szTemp);
		}
		//僼傽僀儖偺応崌
		else if (pliinfo[cnt].nItem & LIST_ITEM_FILE)
		{
			wsprintf(szTemp, _T("\"%s\\%s\" "), pliinfo[cnt].szPath, pliinfo[cnt].szName);
			lstrcat(lpszPath, szTemp);
		}
	
	} //End of for

	//埑弅
//	BOOL bRtn = RunCompress((bAutoUnComp?szCurrentFolder:szEditPath), lpszPath, nCompDLL, bMoveDir);
	BOOL bRtn = RunCompress(szCurrentFolder, lpszPath, nCompDLL, bMoveDir);

	//儊儌儕偺夝曻
	delete[] lpszPath;

	return bRtn;
}

////////////////////////////////////////////////////////////////
BOOL CCompress::RunUnCompress(
		LPTSTR		lpszCurrentFolder,
		LPTSTR		lpszFileName,
		LPTSTR		lpszToFolder,
		DWORD		nCompDLL,
		BOOL		bMoveDir,
		BOOL		bMakeDir)
{
	TCHAR szCmdLine[(MAX_PATH*2)+16];
	TCHAR szLoadFile[MAX_PATH];
	TCHAR szCompFolder[MAX_PATH];

	if(wcslen(lpszFileName) == 0) return FALSE;

	//僼傽僀儖奿擺愭僨傿儗僋僩儕柤嶌惉(乽\乿晅梌)
	if(bMakeDir)
	{
		//帺摦嶌惉
		wsprintf(szCompFolder, _T("%s\\%s\\"), lpszToFolder, lpszFileName);
		LPTSTR lpszTemp = wcsrchr(szCompFolder, _T('.'));
		if(lpszTemp) {
			*lpszTemp = _T('\\');
			*(lpszTemp+1) = 0;
		}
	} else {
		//偦偺傑傑
		wsprintf(szCompFolder, _T("%s\\"), lpszToFolder);
	}

	//僐儅儞僪儔僀儞嶌惉
	wsprintf(szLoadFile, _T("%s\\%s"), lpszCurrentFolder, lpszFileName);
	wsprintf(szCmdLine, _T("e \"%s\" \"%s\""), szLoadFile, szCompFolder);	

	//奿擺僨傿儗僋僩儕嶌惉
	if (GetFileAttributes(szCompFolder) == 0xFFFFFFFF) {
		if(!MakeSureDirectoryPathExists(szCompFolder)) {
			MessageBox(g_MainWnd.m_hWnd, IDS_MSG_COMPERROR5, NULL, MB_OK|MB_ICONSTOP);
			return FALSE;
		}
	}

	//DLL偺儘乕僪
	HMODULE hDLL = OpenDLL(nCompDLL);
	if(!hDLL)
	{
		MessageBox(g_MainWnd.m_hWnd,
			(nCompDLL==COMPDLL_MODE_LHA?IDS_MSG_COMPERROR1:IDS_MSG_COMPERROR2),
			NULL, MB_OK|MB_ICONSTOP);
		
		return FALSE;
	}

	//僼傽僀儖夝搥
	TCHAR szOutBuf[1024];
	memset(szOutBuf, 0x00, sizeof(szOutBuf));
	UNFUNC unXX = (UNFUNC)::GetProcAddress(hDLL, nCompDLL==COMPDLL_MODE_LHA?_T("Unlha"):_T("UnZip"));
	if(unXX)
	{
		//DLL偺屇傃弌偟
		int ret = (*unXX)(NULL, szCmdLine, szOutBuf, sizeof(szOutBuf));

		//DLL偺僋儘乕僘
		CloseDLL(hDLL);

		if(ret != 0) {
			TCHAR szBuf[1024];
			wsprintf(szBuf, IDS_MSG_COMPERROR4, szOutBuf);
			MessageBox(g_MainWnd.m_hWnd, szBuf, NULL, MB_OK|MB_ICONSTOP);
			return FALSE;
		}
	}

	//僣儕乕價儏乕峏怴
	szCompFolder[wcslen(szCompFolder)-1] = 0;
	if(bMoveDir)
		//奿擺愭傊堏摦帪
		g_MainWnd.m_ListView.LoadFolderItem(szCompFolder);
	else
	{
		//堏摦側偟帪
		//僷僗偺嬫愗傝暥帤(\)傪扵偡
		LPTSTR lpszTerm = wcsrchr(szCompFolder, _T('\\'));
		if (lpszTerm) {
			*(lpszTerm) = 0;
			g_MainWnd.m_TreeView.SetCurrentFolder(szCompFolder);
		}
	}

	return TRUE;
}

////////////////////////////////////////////////////////////////
BOOL CCompress::OnFileUnCompress(
		LPTSTR						szCurrentFolder,
		int							nCount,
		struct _tagListItemInfo*	pliinfo,
		DWORD						nCompDLL,
		BOOL						bMoveDir,
		BOOL						bMakeDir,
		BOOL						bAutoUnComp,
		LPTSTR						szEditPath)
{
	TCHAR szPath[MAX_PATH];
	memset(szPath, 0x00, sizeof(szPath));

	BOOL bRtn = FALSE;

	//傾僀僥儉暿偺張棟幚峴
	for(int cnt=0; cnt<nCount; cnt++)
	{
		//懚嵼僠僃僢僋
		TCHAR szTemp[MAX_PATH];
		wsprintf(szTemp, _T("%s\\%s"), pliinfo[cnt].szPath, pliinfo[cnt].szName);
		//僄儔乕帪
		if (GetFileAttributes(szTemp) == 0xFFFFFFFF) continue;
		
		//僨傿儗僋僩儕偺応崌
		if (pliinfo[cnt].nItem & LIST_ITEM_FOLDER)
		{
			wsprintf(szTemp, _T("\"%s\\%s\\*\" "), pliinfo[cnt].szPath, pliinfo[cnt].szName);
		}
		//僼傽僀儖偺応崌
		else if (pliinfo[cnt].nItem & LIST_ITEM_FILE)
		{
			//奼挘巕庢摼
			LPTSTR lpszExt = wcsrchr(pliinfo[cnt].szName, _T('.'));
			if (lpszExt == NULL) continue;
//			TCHAR szExt[6];
//			wcscpy(szExt, lpszExt);
//			wcsupr(szExt);

			//夝搥僼傽僀儖偺奿擺応強
			LPTSTR lpszTemp = (bAutoUnComp?pliinfo[cnt].szPath:szEditPath);

			//奼挘巕僠僃僢僋亄埑弅僼傽僀儖夝搥
			//LHA宍幃偺応崌
			if(wcsicmp(lpszExt, _T(".LZH"))==0 && g_MainWnd.m_Compress.IsCompress(COMPDLL_MODE_LHA))
			{
				if(RunUnCompress(pliinfo[cnt].szPath,
					pliinfo[cnt].szName, lpszTemp, COMPDLL_MODE_LHA, bMoveDir, bMakeDir))
					bRtn = TRUE;
			}
			//ZIP宍幃偺応崌
			else if(wcsicmp(lpszExt, _T(".ZIP"))==0 && g_MainWnd.m_Compress.IsCompress(COMPDLL_MODE_ZIP))
			{
				if(RunUnCompress(pliinfo[cnt].szPath,
				   pliinfo[cnt].szName, lpszTemp, COMPDLL_MODE_ZIP, bMoveDir, bMakeDir))
					bRtn = TRUE;
			}
		}

	} //End of for

	return bRtn;
}

////////////////////////////////////////////////////////////////
BOOL CCompress::IsCompress(DWORD nCompDLL)
{
	if(nCompDLL == COMPDLL_MODE_LHA && m_bLhaChk)
		return TRUE;
	if(nCompDLL == COMPDLL_MODE_ZIP && m_bZipChk)
		return TRUE;
	return FALSE;
}

////////////////////////////////////////////////////////////////
BOOL CCompress::IsUnCompress()
{
	if(m_bLhaChk || m_bZipChk)
		return TRUE;
	return FALSE;
}
////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -