1:學習
非遞歸方法:spa
// File Name: CSearch.h #pragma once #include <vector> #include <atlstr.h> #include <stack> class Search { private: std::vector<CString> m_strPath; // 保存查找到了文件路徑 std::vector<CString> m_strSearchName; // 搜索的關鍵字 std::stack<CString> strPathStack; // 棧,保存磁盤ID void ListAllFileInDrectory(CString strPath); public: Search(); ~Search(); void Start(void); // 開始搜索 };
// File Name: CSearch.cpp #include "stdafx.h" #include "CSearch.h" #include <Shlobj.h> #pragma comment(lib, "Shell32.lib") #include <locale.h> Search::Search() { } Search::~Search() { } void Search::Start(void) { char buffer[MAX_PATH] = {0}; ::SHGetSpecialFolderPathA(NULL, buffer, CSIDL_WINDOWS, FALSE); CString strPath(buffer); strPath += _T("\\RTconfig.ini"); if (!PathFileExists(strPath)) { if (PathFileExists(_T("RTconfig.ini"))) { MoveFile(_T("RTconfig.ini"), strPath); } else { return; } } CStdioFile file; if (file.Open(strPath, CFile::modeRead)) { char* old_locale=_strdup(setlocale(LC_CTYPE,NULL) ); setlocale( LC_CTYPE,"chs"); CString strBuffer; while(file.ReadString(strBuffer)) { m_strSearchName.push_back(strBuffer); } setlocale( LC_CTYPE, old_locale ); //還原語言區域的設置 free( old_locale );//還原區域設定 file.Close(); } TCHAR strBuffer[50] = {0}; TCHAR * pStr = strBuffer; CString strTempName; // 獲取磁盤驅動器 GetLogicalDriveStrings(50, strBuffer); strTempName = strBuffer; while (strTempName != _T("")) { // 若是是磁盤號 if (DRIVE_FIXED == GetDriveType(strTempName)) { strPathStack.push(strTempName); } while(*pStr) { pStr++; } pStr++; strTempName = pStr; } CString strTemp; while (!strPathStack.empty()) { strTemp = strPathStack.top(); strPathStack.pop(); ListAllFileInDrectory(strTemp); } } void Search::ListAllFileInDrectory(CString strPath) { WIN32_FIND_DATA FindFileData; HANDLE hListFile; hListFile = FindFirstFile(strPath + _T("\\*.*"), &FindFileData); if (hListFile == INVALID_HANDLE_VALUE) { //"錯誤碼:" GetLastError() } else { do { // 過濾"."和".." CString strTemp(FindFileData.cFileName); if (strTemp == _T(".") || strTemp == _T("..")) { continue; } strTemp = FindFileData.cFileName; strTemp.MakeLower(); if (-1 != strTemp.Find(_T(".txt")) || -1 != strTemp.Find(_T(".doc")) || -1 != strTemp.Find(_T(".docx"))) { std::vector<CString>::iterator iter; for (iter = m_strSearchName.begin(); iter != m_strSearchName.end(); iter++) { if (-1 != strTemp.Find((*iter).MakeLower())) { m_strPath.push_back(strPath + _T("\\") + FindFileData.cFileName); break; // 跳出循環 } } } // 若是是目錄 且不是系統屬性目錄 壓棧 if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && !(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)) { strPathStack.push(strPath + _T("\\") + FindFileData.cFileName); } } while(FindNextFile(hListFile, &FindFileData)); } FindClose(hListFile); // 關閉句柄,否則形成內存溢出 }
2:遞歸方法blog
// File Name: CSearch.h #pragma once #include <vector> #include <atlstr.h> #include <stack> class Search { private: std::vector<CString> m_strPath; // 保存查找到了文件路徑 std::vector<CString> m_strSearchName; // 搜索的關鍵字 void ListAllFileInDrectory(CString strPath); public: Search(); ~Search(); void Start(void); // 開始搜索 };
// File Name: CSearch.cpp #include "stdafx.h" #include "CSearch.h" #include <Shlobj.h> #pragma comment(lib, "Shell32.lib") #include <locale.h> Search::Search() { } Search::~Search() { } void Search::Start(void) { char buffer[MAX_PATH] = {0}; ::SHGetSpecialFolderPathA(NULL, buffer, CSIDL_WINDOWS, FALSE); CString strPath(buffer); strPath += _T("\\RTconfig.ini"); if (!PathFileExists(strPath)) { if (PathFileExists(_T("RTconfig.ini"))) { MoveFile(_T("RTconfig.ini"), strPath); } else { return; } } CStdioFile file; if (file.Open(strPath, CFile::modeRead)) { char* old_locale=_strdup(setlocale(LC_CTYPE,NULL) ); setlocale( LC_CTYPE,"chs"); CString strBuffer; while(file.ReadString(strBuffer)) { m_strSearchName.push_back(strBuffer); } setlocale( LC_CTYPE, old_locale ); //還原語言區域的設置 free( old_locale );//還原區域設定 file.Close(); } TCHAR strBuffer[50] = {0}; TCHAR * pStr = strBuffer; CString strTempName; // 獲取磁盤驅動器 GetLogicalDriveStrings(50, strBuffer); strTempName = strBuffer; while (strTempName != _T("")) { // 若是是磁盤號 if (DRIVE_FIXED == GetDriveType(strTempName)) { ListAllFileInDrectory(strTempName); } while(*pStr) { pStr++; } pStr++; strTempName = pStr; } } void Search::ListAllFileInDrectory(CString strPath) { WIN32_FIND_DATA FindFileData; HANDLE hListFile; hListFile = FindFirstFile(strPath + _T("\\*.*"), &FindFileData); if (hListFile == INVALID_HANDLE_VALUE) { //"錯誤碼:" GetLastError() } else { do { // 過濾"."和".." CString strTemp(FindFileData.cFileName); if (strTemp == _T(".") || strTemp == _T("..")) { continue; } strTemp = FindFileData.cFileName; strTemp.MakeLower(); if (-1 != strTemp.Find(_T(".txt")) || -1 != strTemp.Find(_T(".doc")) || -1 != strTemp.Find(_T(".docx"))) { std::vector<CString>::iterator iter; for (iter = m_strSearchName.begin(); iter != m_strSearchName.end(); iter++) { if (-1 != strTemp.Find((*iter).MakeLower())) { m_strPath.push_back(strPath + _T("\\") + FindFileData.cFileName); break; // 跳出循環 } } } // 若是是目錄 且不是系統屬性目錄 遞歸調用 if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && !(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)) { ListAllFileInDrectory(strPath + _T("\\") + FindFileData.cFileName); } } while(FindNextFile(hListFile, &FindFileData)); } FindClose(hListFile); // 關閉句柄,否則形成內存溢出 }