Поиск всех файлов в каталоге
От:
Наденька
Дата: 22.05.03 13:15
Оценка:
Здравствуйте!
На данный момент я в диалоге с использованием CFileDialog передаю путь нужного файла.
void CMakeFreqDictDlg::GetFileName(CString &strName)
{
CString Filter;
Filter.LoadString(IDS_FILTER_ALLDICTS);
CFileDialog dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, (LPCSTR)Filter);
dlgFile.m_ofn.lpstrTitle = "Choose dictionary" ;
dlgFile.m_ofn.lpstrInitialDir = strName.Left(strName.ReverseFind('\\' ) + 1);
if (dlgFile.DoModal() == IDOK)
{
strName = dlgFile.GetPathName();
CWnd::UpdateData(FALSE);
}
}
Я хочу изменить поиск, чтобы можно было в каком-нибудь похожем диалоге указать только папку и потом найти все файлы в этой директории и во всех ее поддиректориях, удовлетворяющие фильтру.
Я так поняла, что если поставить флаг OFN_ALLOWMULTISELECT, то можно будет выбрать несколько файлов, но в одной директории и до них все равно придется идти самим. А это плохо.
Если бы я научилась в диалоге поиска указать только желаемую папку (и возвращать соответственно полный путь до этой папки), то потом используя этот путь я бы попыталась найти все файлы методами FindFile() и FindNextFile().
Посоветуйте, пожалуйста как это лучше сделать.
Извините, если плохо сформулировала вопрос, я новичок. Спасибо.
Re: Поиск всех файлов в каталоге
//---------------------------------------------------------------------------------
void CClearSiteDlg::OnOpenDialog()
{
CountFindFiles = 0;
CString strSelectedFolder;
m_path.GetWindowText(strSelectedFolder);
LPTSTR szPath = strSelectedFolder.GetBuffer(_MAX_PATH);
m_path.GetWindowText((CString)szPath);
strSelectedFolder.ReleaseBuffer();
if (GetFolder(&strSelectedFolder, "Выберете каталог сайта" , szPath, NULL, this ->m_hWnd)) {
DirSite = strSelectedFolder;
CWaitCursor waitCur;
//подсчитываем количество фалов
GetCountFile(szPath, "*.*" );
//обновляем caption формы
UpdateCaptionForm(FinishFindFiles);
//отображаем выбранный путь в CStatic
m_path.SetWindowText(strSelectedFolder);
waitCur.Restore();
}
}
//---------------------------------------------------------------------------------
static int CALLBACK
BrowseCallbackProc (HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
TCHAR szPath[_MAX_PATH];
switch (uMsg) {
case BFFM_INITIALIZED:
if (lpData)
SendMessage(hWnd,BFFM_SETSELECTION,TRUE,lpData);
break ;
case BFFM_SELCHANGED:
SHGetPathFromIDList(LPITEMIDLIST(lParam),szPath);
SendMessage(hWnd, BFFM_SETSTATUSTEXT, NULL, LPARAM(szPath));
break ;
}
return 0;
}
//---------------------------------------------------------------------------------
bool CClearSiteDlg::GetFolder (CString* strSelectedFolder, LPCTSTR szTitle, LPTSTR szPath, LPCTSTR szRoot, HWND hWndOwner)
{
if (szPath == NULL) return false ;
bool result = false ;
BROWSEINFO bi;
::ZeroMemory(&bi,sizeof bi);
bi.ulFlags = BIF_RETURNONLYFSDIRS;
// дескриптор окна-владельца диалога
bi.hwndOwner = hWndOwner;
// добавление заголовка к диалогу
bi.lpszTitle = szTitle;
// отображение текущего каталога
bi.lpfn = BrowseCallbackProc;
bi.ulFlags |= BIF_RETURNONLYFSDIRS ;
// установка каталога по умолчанию
bi.lParam = LPARAM(szPath);
// установка корневого каталога
if (szRoot != NULL) {
IShellFolder *pDF;
if (SHGetDesktopFolder(&pDF) == NOERROR) {
LPITEMIDLIST pIdl = NULL;
ULONG chEaten;
ULONG dwAttributes;
USES_CONVERSION;
LPOLESTR oleStr = T2OLE(szRoot);
pDF->ParseDisplayName(NULL,NULL,oleStr,&chEaten,&pIdl,&dwAttributes);
pDF->Release();
bi.pidlRoot = pIdl;
}
}
LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi);
if (pidl != NULL) {
TCHAR lpstrBuffer[_MAX_PATH] = _T("" );
SHGetPathFromIDList(pidl, lpstrBuffer);
strSelectedFolder->Format("%s" ,lpstrBuffer);
result = true ;
}
// free memory returned by SHBrowseForFolder
LPMALLOC lpm;
if (SHGetMalloc(&lpm) == NOERROR) lpm->Free(pidl);
return result;
}
//-------------------------------------------------------------------------------------
void CClearSiteDlg::GetCountFile(char * path,char * mask)
{
WIN32_FIND_DATA FileData;
HANDLE hSearch;
char NewPath[MAX_PATH];
char fpath[MAX_PATH];
strcpy(fpath,path);
strcat(fpath,"\\" );
strcat(fpath,mask);
if (hSearch=FindFirstFile(fpath,&FileData))
{
if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(FileData.cFileName,".." ) && strcmp(FileData.cFileName,"." ))
{
if (PosNoCase(ExtractFileExt(FileData.cFileName, ext), "htm" ) || PosNoCase(ExtractFileExt(FileData.cFileName, ext), "php" ) || (((CString)ExtractFileExt(FileData.cFileName, ext) == ".js" ) && m_chCleanJSFiles.GetCheck())) // || (ExtractFileExt(FileData.cFileName) == NULL)
{
CountFindFiles++;
}
}
while (FindNextFile(hSearch,&FileData))
{
if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(FileData.cFileName,".." ) && strcmp(FileData.cFileName,"." ))
{
if (PosNoCase(ExtractFileExt(FileData.cFileName, ext), "htm" ) || PosNoCase(ExtractFileExt(FileData.cFileName, ext), "php" ) || (((CString)ExtractFileExt(FileData.cFileName, ext) == ".js" ) && m_chCleanJSFiles.GetCheck()))
{
CountFindFiles++;
}
}
}
}
FindClose(hSearch);//поиск файлов закон?или, теперь ищем подпапки
strcpy(fpath,path);
strcat(fpath,"\\*.*" );
if (hSearch=FindFirstFile(fpath,&FileData))
{
if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(FileData.cFileName,".." )&&strcmp(FileData.cFileName,"." ))
{
strcpy(NewPath,path);
strcat(NewPath,"\\" );
strcat(NewPath,FileData.cFileName);
GetCountFile(NewPath,mask); //ЭТО НАЗЫВАЕТСЯ "РЕКУРСИЯ"
}
while (FindNextFile(hSearch,&FileData))
{
if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(FileData.cFileName,".." )&&strcmp(FileData.cFileName,"." ))
{
strcpy(NewPath,path);
strcat(NewPath,"\\" );
strcat(NewPath,FileData.cFileName);
GetCountFile(NewPath,mask); //ЭТО НАЗЫВАЕТСЯ "РЕКУРСИЯ"
}
}
}
}
//-------------------------------------------------------------------------------------
char * CClearSiteDlg::ExtractFileExt(const char * FileName, char *ext)
{
char dummy[_MAX_PATH];
_splitpath( FileName, dummy, dummy, dummy, ext );
return ext;
}
//-------------------------------------------------------------------------------------
bool CClearSiteDlg::PosNoCase(char * S, char * Substr)
{
if (strstr( _strlwr( _strdup(S)), Substr) == NULL) return false ;
else return true ;
}
//-------------------------------------------------------------------------------------
Re: Поиск всех файлов в каталоге
//---------------------------------------------------------------------------------
void CClearSiteDlg::OnOpenDialog()
{
CountFindFiles = 0;
CString strSelectedFolder;
m_path.GetWindowText(strSelectedFolder);
LPTSTR szPath = strSelectedFolder.GetBuffer(_MAX_PATH);
m_path.GetWindowText((CString)szPath);
strSelectedFolder.ReleaseBuffer();
if (GetFolder(&strSelectedFolder, "Выберете каталог сайта" , szPath, NULL, this ->m_hWnd)) {
DirSite = strSelectedFolder;
CWaitCursor waitCur;
//подсчитываем количество фалов
GetCountFile(szPath, "*.*" );
//обновляем caption формы
UpdateCaptionForm(FinishFindFiles);
//отображаем выбранный путь в CStatic
m_path.SetWindowText(strSelectedFolder);
waitCur.Restore();
}
}
//---------------------------------------------------------------------------------
static int CALLBACK
BrowseCallbackProc (HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
TCHAR szPath[_MAX_PATH];
switch (uMsg) {
case BFFM_INITIALIZED:
if (lpData)
SendMessage(hWnd,BFFM_SETSELECTION,TRUE,lpData);
break ;
case BFFM_SELCHANGED:
SHGetPathFromIDList(LPITEMIDLIST(lParam),szPath);
SendMessage(hWnd, BFFM_SETSTATUSTEXT, NULL, LPARAM(szPath));
break ;
}
return 0;
}
//---------------------------------------------------------------------------------
bool CClearSiteDlg::GetFolder (CString* strSelectedFolder, LPCTSTR szTitle, LPTSTR szPath, LPCTSTR szRoot, HWND hWndOwner)
{
if (szPath == NULL) return false ;
bool result = false ;
BROWSEINFO bi;
::ZeroMemory(&bi,sizeof bi);
bi.ulFlags = BIF_RETURNONLYFSDIRS;
// дескриптор окна-владельца диалога
bi.hwndOwner = hWndOwner;
// добавление заголовка к диалогу
bi.lpszTitle = szTitle;
// отображение текущего каталога
bi.lpfn = BrowseCallbackProc;
bi.ulFlags |= BIF_RETURNONLYFSDIRS ;
// установка каталога по умолчанию
bi.lParam = LPARAM(szPath);
// установка корневого каталога
if (szRoot != NULL) {
IShellFolder *pDF;
if (SHGetDesktopFolder(&pDF) == NOERROR) {
LPITEMIDLIST pIdl = NULL;
ULONG chEaten;
ULONG dwAttributes;
USES_CONVERSION;
LPOLESTR oleStr = T2OLE(szRoot);
pDF->ParseDisplayName(NULL,NULL,oleStr,&chEaten,&pIdl,&dwAttributes);
pDF->Release();
bi.pidlRoot = pIdl;
}
}
LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi);
if (pidl != NULL) {
TCHAR lpstrBuffer[_MAX_PATH] = _T("" );
SHGetPathFromIDList(pidl, lpstrBuffer);
strSelectedFolder->Format("%s" ,lpstrBuffer);
result = true ;
}
// free memory returned by SHBrowseForFolder
LPMALLOC lpm;
if (SHGetMalloc(&lpm) == NOERROR) lpm->Free(pidl);
return result;
}
//-------------------------------------------------------------------------------------
void CClearSiteDlg::GetCountFile(char * path,char * mask)
{
WIN32_FIND_DATA FileData;
HANDLE hSearch;
char NewPath[MAX_PATH];
char fpath[MAX_PATH];
strcpy(fpath,path);
strcat(fpath,"\\" );
strcat(fpath,mask);
if (hSearch=FindFirstFile(fpath,&FileData))
{
if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(FileData.cFileName,".." ) && strcmp(FileData.cFileName,"." ))
{
if (PosNoCase(ExtractFileExt(FileData.cFileName, ext), "htm" ) || PosNoCase(ExtractFileExt(FileData.cFileName, ext), "php" ) || (((CString)ExtractFileExt(FileData.cFileName, ext) == ".js" ) && m_chCleanJSFiles.GetCheck())) // || (ExtractFileExt(FileData.cFileName) == NULL)
{
CountFindFiles++;
}
}
while (FindNextFile(hSearch,&FileData))
{
if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(FileData.cFileName,".." ) && strcmp(FileData.cFileName,"." ))
{
if (PosNoCase(ExtractFileExt(FileData.cFileName, ext), "htm" ) || PosNoCase(ExtractFileExt(FileData.cFileName, ext), "php" ) || (((CString)ExtractFileExt(FileData.cFileName, ext) == ".js" ) && m_chCleanJSFiles.GetCheck()))
{
CountFindFiles++;
}
}
}
}
FindClose(hSearch);//поиск файлов закон?или, теперь ищем подпапки
strcpy(fpath,path);
strcat(fpath,"\\*.*" );
if (hSearch=FindFirstFile(fpath,&FileData))
{
if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(FileData.cFileName,".." )&&strcmp(FileData.cFileName,"." ))
{
strcpy(NewPath,path);
strcat(NewPath,"\\" );
strcat(NewPath,FileData.cFileName);
GetCountFile(NewPath,mask); //ЭТО НАЗЫВАЕТСЯ "РЕКУРСИЯ"
}
while (FindNextFile(hSearch,&FileData))
{
if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(FileData.cFileName,".." )&&strcmp(FileData.cFileName,"." ))
{
strcpy(NewPath,path);
strcat(NewPath,"\\" );
strcat(NewPath,FileData.cFileName);
GetCountFile(NewPath,mask); //ЭТО НАЗЫВАЕТСЯ "РЕКУРСИЯ"
}
}
}
}
//-------------------------------------------------------------------------------------
char * CClearSiteDlg::ExtractFileExt(const char * FileName, char *ext)
{
char dummy[_MAX_PATH];
_splitpath( FileName, dummy, dummy, dummy, ext );
return ext;
}
//-------------------------------------------------------------------------------------
bool CClearSiteDlg::PosNoCase(char * S, char * Substr)
{
if (strstr( _strlwr( _strdup(S)), Substr) == NULL) return false ;
else return true ;
}
//-------------------------------------------------------------------------------------
Re[2]: Поиск всех файлов в каталоге
Здравствуйте, stuff, Вы писали:
S>
S>//Skip
S>
Могу то-же самое в виде проекта с мультитридами, но на мыло. По сетке искать быстрее. Винт к сожалению после 100-го трида умирать пытается
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить