📄 compress.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 + -