📄 filesearch.cpp
字号:
///////////////////////////////////////////////////////////////
//FileSearch.cpp
//僼傽僀儖専嶕愝掕/僼傽僀儖専嶕
///////////////////////////////////////////////////////////////
//INCLUDE
#include "GSFinder.h"
#include "FileSearch.h"
#ifdef __POCKET_PC
#include "FolderDlgPPC.h"
#else
#include "FolderDlg.h"
#endif
///////////////////////////////////////////////////////////////
//僌儘乕僶儖曄悢
CFileSearch *g_pfsch;
///////////////////////////////////////////////////////////////
//暥帤楍専嶕(儚僀儖僪僇乕僪偺傒懳墳)
BOOL StrStr(LPTSTR lpszData, LPTSTR lpszWord, BOOL bUpr)
{
LPTSTR lpszDataPos = lpszData;
LPTSTR lpszWordPos = lpszWord;
TCHAR szDataTemp[MAX_PATH] = _T("");
TCHAR szWordTemp[MAX_PATH] = _T("");
//戝巕暥帤嬫暿柍偟
if(!bUpr)
{
//専嶕尦傪戝暥帤偵曄姺
wcscpy(szDataTemp, lpszDataPos);
wcsupr(szDataTemp);
lpszDataPos = szDataTemp;
#if 0
wcscpy(szWordTemp, lpszWordPos);
wcsupr(szWordTemp);
lpszWordPos = szWordTemp;
#endif
}
//暥帤専嶕奐巒(専嶕暥帤偑側偔側傞傑偱)
while(*lpszWordPos)
{
if(*lpszWordPos == _T('*'))
{
lpszWordPos++;
}
else if(!(*lpszDataPos))
{
break;
}
else
{
if(*lpszWordPos == _T('?'))
{
lpszWordPos++;
lpszDataPos++;
}
else
{
//専嶕暥帤偺廔抂傪妋擣
LPTSTR lpszEnd = wcschr(lpszWordPos, _T('*'));
if(!lpszEnd)
lpszEnd = wcschr(lpszWordPos, _T('?'));
//僠僃僢僋暥帤楍嶌惉
TCHAR szBuf[MAX_PATH];
int nLen = (lpszEnd?lpszEnd-lpszWordPos:wcslen(lpszWordPos));
wcsncpy(szBuf, lpszWordPos, nLen);
szBuf[nLen] = 0x00;
//暥帤楍僠僃僢僋
LPTSTR lpszTemp = wcsstr(lpszDataPos, szBuf);
//専嶕偵幐攕(亖晄堦抳)
if(!lpszTemp) return FALSE;
//僠僃僢僋枹姰椆偺応崌(屻懕偁傝)
lpszWordPos += nLen;
lpszDataPos = lpszTemp + nLen;
}
}
} //End of while
if(*lpszWordPos) return FALSE;
return TRUE;
}
///////////////////////////////////////////////////////////////
//僼傽僀儖忦審僠僃僢僋
BOOL TextCheck(LPTSTR lpszPath, LPTSTR lpszName, DWORD dwSize, LPTSTR lpszWord, BOOL bUpr)
{
TCHAR szPath[MAX_PATH];
//僷僗暥帤楍嶌惉
if(wcslen(lpszPath))
wsprintf(szPath, _T("%s\\%s"), lpszPath, lpszName);
else
wsprintf(szPath, _T("\\%s"), lpszName);
//僼傽僀儖僆乕僾儞
HANDLE hFile = CreateFile(szPath, GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
//僆乕僾儞偵幐攕
if(INVALID_HANDLE_VALUE == hFile) return FALSE;
//僶僢僼傽嶌惉
int nWordLen = wcslen(lpszWord)*2+1;
char *szWordBuf1 = new char[nWordLen];
char *szWordBuf2 = new char[nWordLen];
//暥帤曄姺(Unicode->S-JIS)
memset(szWordBuf1, 0x00, nWordLen);
memset(szWordBuf2, 0x00, nWordLen);
wcstombs(szWordBuf1, lpszWord, nWordLen);
wcstombs(szWordBuf2, lpszWord, nWordLen);
//戝暥帤彫暥帤嬫暿柍偟
if(!bUpr)
{
_strupr(szWordBuf1);
_strlwr(szWordBuf2);
}
//僼傽僀儖偺撉傒崬傒仌僠僃僢僋
DWORD dwLen=0;
char *pchk1 = szWordBuf1;
char *pchk2 = szWordBuf2;
BOOL bChk=FALSE;
while(!bChk)
{
DWORD dwRead;
char szDataBuf[4096];
memset(szDataBuf, 0x00, sizeof(szDataBuf));
//僼傽僀儖偺撉傒崬傒
dwRead = 0;
if(!ReadFile(hFile, &szDataBuf, sizeof(szDataBuf), &dwRead, 0) || !dwRead)
break;
//僶僢僼傽撪梕傪1僶僀僩偯偮僠僃僢僋
for(DWORD i=0; i<dwRead && !bChk; i++)
{
//愭摢1僶僀僩偺傒斾妑
if(!bUpr)
{
if((*pchk1) != szDataBuf[i] &&
(*pchk2) != szDataBuf[i]) continue;
}
else
if((*pchk1) != szDataBuf[i]) continue;
//僠僃僢僋偡傞儗儞僌僗嶼弌
DWORD nLen = strlen(pchk1);
if(nLen > (dwRead-i))
nLen = dwRead-i;
//戝彫暥帤嬫暿柍偟
if(!bUpr)
{
//暥帤楍僠僃僢僋
for(DWORD j=0; j<nLen; j++)
{
bChk = TRUE;
//戝彫暥帤偄偯傟偐偑堦抳偟側偄応崌
if((*pchk1) != szDataBuf[i+j] &&
(*pchk2) != szDataBuf[i+j]) {
pchk1 = szWordBuf1;
pchk2 = szWordBuf2;
bChk = FALSE;
break;
}
pchk1++;
pchk2++;
} //End of for
}
//戝彫暥帤嬫暿桳傝
else
{
//暥帤楍僠僃僢僋
if(memcmp(pchk1, &szDataBuf[i], nLen) == 0)
{
pchk1 += nLen;
bChk = TRUE;
break;
} else {
pchk1 = szWordBuf1;
}
}
} //End of for
//僇僂儞僞峏怴
dwLen += dwRead;
} //End of for
//僶僢僼傽嶍彍
delete[] szWordBuf1;
delete[] szWordBuf2;
//僼傽僀儖僋儘乕僘
CloseHandle(hFile);
return bChk;
}
///////////////////////////////////////////////////////////////
//僂傿儞僪僂僗僞僀儖愝掕
LONG SetWindowStyle(HWND hWnd, LONG style, BOOL Add) {
LONG src;
LONG n;
src = GetWindowLong(hWnd, GWL_STYLE);
if(Add) {
n = src | style;
} else {
n = src & ~style;
}
SetWindowLong(hWnd, GWL_STYLE, n);
return n;
}
///////////////////////////////////////////////////////////////
//僂傿儞僪僂僾儘僔乕僕儍
LRESULT CALLBACK FileSearchProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
g_pfsch->m_hWnd = hDlg;
g_pfsch->OnInit();
break;
}
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
switch(wmId)
{
//擔晅僠僃僢僋儃僞儞墴壓
case IDC_CHK_DATE:
g_pfsch->OnChkDateChange();
break;
//僒僀僘僠僃僢僋儃僞儞墴壓
case IDC_CHK_SIZE:
g_pfsch->OnChkSizeChange();
break;
//嶲徠儃僞儞墴壓
case IDC_BTN_BROWSE:
g_pfsch->OnBrowse();
break;
//OK儃僞儞墴壓
case IDOK:
ShowWindow(hDlg, SW_HIDE);
g_pfsch->OnOK();
break;
//擔晅庬暿曄峏
case IDC_COMB_DATE:
g_pfsch->OnCombDateChange();
break;
//僒僀僘庬暿曄峏
case IDC_COMB_SIZE:
g_pfsch->OnCombSizeChange();
break;
//僉儍儞僙儖儃僞儞墴壓
case IDCANCEL:
{
EndDialog(hDlg, (INT)FALSE);
return TRUE;
}
}
break;
}
case WM_DLGCLOSE:
{
#ifdef __POCKET_PC
//SIP僋儘乕僘
SipShowIM(SIPF_OFF);
#endif
int rc = g_pfsch->OnFileSerch();
EndDialog(hDlg, rc);
break;
}
#ifdef __POCKET_PC
case WM_PAINT:
return DefDlgPaintProc(hDlg, wParam, lParam);
case WM_CTLCOLORSTATIC:
return DefDlgCtlColorStaticProc(hDlg, wParam, lParam);
#endif
}
return FALSE;
}
///////////////////////////////////////////////////////////////
//僐儞僗僩儔僋僞
CFileSearch::CFileSearch(HWND hWnd, HINSTANCE hInst, LPTSTR lpszPath)
{
g_pfsch = this;
//僷儔儊乕僞偺曐懚
m_hparWnd = hWnd;
m_hInst = hInst;
if(lpszPath)
wcscpy(m_szCurrent, lpszPath);
else
m_szCurrent[0]=0x00;
//僐儞僩儘乕儖偺弶婜壔
InitCommonControls();
//擔晅巜掕僐儞僩儘乕儖偺弶婜壔
INITCOMMONCONTROLSEX ctl;
ctl.dwSize = sizeof(ctl);
ctl.dwICC = ICC_DATE_CLASSES;
InitCommonControlsEx(&ctl);
//儊儞僶曄悢偺弶婜壔
m_ListView = &g_MainWnd.m_ListView;
}
///////////////////////////////////////////////////////////////
//僨僗僩儔僋僞
CFileSearch::~CFileSearch()
{
}
///////////////////////////////////////////////////////////////
//僂傿儞僪僂僆乕僾儞
int CFileSearch::Open()
{
#ifdef __POCKET_PC
//SIP僆乕僾儞
BOOL bSetSip = FALSE;
SIPINFO si;
memset(&si, 0, sizeof(SIPINFO));
si.cbSize = sizeof(SIPINFO);
SipGetInfo(&si);
if ((si.fdwFlags&SIPF_ON)!=SIPF_ON)
{
SipShowIM(SIPF_ON);
bSetSip = TRUE;
}
#endif
//僂傿儞僪僂嶌惉
int rtn = DialogBox(m_hInst, (LPCTSTR)IDD_SEARCH_DLG,
m_hparWnd, (DLGPROC)FileSearchProc);
#ifdef __POCKET_PC
//SIP僋儘乕僘
if (bSetSip)
SipShowIM(SIPF_OFF);
#endif
return rtn;
}
///////////////////////////////////////////////////////////////
void CFileSearch::SetEditPath(LPTSTR lpszPath)
{
//専嶕僷僗偺応崌丄儖乕僩傪愝掕偡傞
if((!wcslen(lpszPath)) || (wcscmp(SEARCH_FOLDER_NAME, lpszPath)==0))
{
SetWindowText(GetDlgItem(m_hWnd, IDC_EDIT_PATH), GetRootName());
}
else
{
wcscpy(m_szCurrent, lpszPath);
SetWindowText(GetDlgItem(m_hWnd, IDC_EDIT_PATH), lpszPath);
}
}
///////////////////////////////////////////////////////////////
void CFileSearch::SetDateList()
{
HWND hCB = GetDlgItem(m_hWnd, IDC_COMB_DATE);
if(hCB)
{
SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)IDS_LIST_DATETYPE_CMP);
SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)IDS_LIST_DATETYPE_AREA);
SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)IDS_LIST_DATETYPE_BEF);
SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)IDS_LIST_DATETYPE_AFT);
}
}
///////////////////////////////////////////////////////////////
void CFileSearch::SetSizeList()
{
HWND hCB = GetDlgItem(m_hWnd, IDC_COMB_SIZE);
if(hCB)
{
SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)IDS_LIST_SIZETYPE_CMP);
SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)IDS_LIST_SIZETYPE_LOW);
SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)IDS_LIST_SIZETYPE_HIGH);
}
}
///////////////////////////////////////////////////////////////
//僼傽僀儖忦審僠僃僢僋
BOOL CFileSearch::FileCheck(WIN32_FIND_DATA *lpFind, SEARCHINFO *lpSearch, LPTSTR lpszPath)
{
//僼傽僀儖柤僠僃僢僋
if(wcslen(lpSearch->szName))
{
if(!StrStr(lpFind->cFileName, lpSearch->szName, FALSE))
{
return FALSE;
}
}
//僨傿儗僋僩儕偺応崌偼偙偙傑偱
if (lpFind->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -