view plaincopyprint? //--------------------------------------------------------------------------- #ifndef SearchFilesUnitH #define SearchFilesUnitH //--------------------------------------------------------------------------- #include <windows.h> #include <stdio.h> typedef void(__stdcall *PSEARCHCALLBACK)(LPCTSTR); typedef void(__stdcall *PDIRCOMPLETEDCALLBACK)(LPCTSTR); class CSearchFile { public: // 無深度初始化構造函數,此時掃描深度不受限制 CSearchFile() { m_depthLevel = -1; } // 掃描深度初始化構造函數 CSearchFile(int depthLevel) { m_depthLevel = depthLevel; } private: int m_depthLevel; private: BOOL DirectoryExist(LPCTSTR lpszDir) { DWORD dwAttribute = ::GetFileAttributes(lpszDir); if (dwAttribute != 0xFFFFFFFF) { return ((dwAttribute & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY); } return FALSE; } public: BOOL SearchFile( LPCTSTR root /* 搜索文件的根目錄 */ , PSEARCHCALLBACK pFoundCallback /* 文件搜到後的 Callback 在此Callback中可以實現 文件類型的過濾,文件刪除,復制等等 與文件相關的操作 */ , PDIRCOMPLETEDCALLBACK pDirCompletedCallback /* 完成一個子目錄後的 Callback 在此Callback中可以配合上個Callback 的文件刪除功能,刪除文件夾 */ , int depthLevel = 0 ); }; #endif .cpp 文件 [cpp]view plaincopyprint? //--------------------------------------------------------------------------- #include "SearchFilesUnit.h" //--------------------------------------------------------------------------- BOOL CSearchFile::SearchFile( LPCTSTR root /* 搜索文件的根目錄 */ , PSEARCHCALLBACK pFoundCallback /* 文件搜到後的 Callback 在此Callback中可以實現 文件類型的過濾,文件刪除,復制等等 與文件相關的操作 */ , PDIRCOMPLETEDCALLBACK pDirCompletedCallback /* 完成一個子目錄後的 Callback 在此Callback中可以配合上個Callback 的文件刪除功能,刪除文件夾 */ , int depthLevel ) { char szPath[MAX_PATH] = {0}; WIN32_FIND_DATA stWFD; memset(&stWFD, 0, sizeof(WIN32_FIND_DATA)); sprintf(szPath, "%s\\*", root); // 如果有掃描深度控制 if (m_depthLevel > 0) { if (depthLevel++ > m_depthLevel) { depthLevel = 0; return FALSE; } } HANDLE file = ::FindFirstFile(szPath, &stWFD); if (INVALID_HANDLE_VALUE == file) return FALSE; do { if (strcmp(stWFD.cFileName, ".") && strcmp(stWFD.cFileName, "..")) { char szFoundFile[MAX_PATH] = { 0 }; sprintf(szFoundFile, "%s\\%s", root, stWFD.cFileName); // 判斷是目錄還是文件 if (DirectoryExist(szFoundFile)) { SearchFile(szFoundFile, pFoundCallback, pDirCompletedCallback, depthLevel); } if (NULL != pFoundCallback) { pCallback(szFoundFile); } } }while (::FindNextFile(file, &stWFD)); ::FindClose(file); if (NULL != pDirCompletedCallback) { pDirCompletedCallback(root); } return TRUE; }