在Windows平台開發中,常需遍歷目錄樹並對文件執行自定義操作(過濾、刪除、複製等)。硬編碼遍歷邏輯會導致代碼難以復用,採用回調函數配合可配置遞歸深度,可構建靈活、解耦的文件搜索組件。
class CSearchFile {
public:
// 無深度限制構造函數
CSearchFile() : m_depthLevel(-1) {}
// 指定最大遞歸深度
explicit CSearchFile(int depthLevel) : m_depthLevel(depthLevel) {}
// 文件發現回調:執行過濾、刪除、複製等業務邏輯
using PSEARCHCALLBACK = void(__stdcall *)(LPCTSTR);
// 目錄完成回調:配合文件操作實現目錄清理等
using PDIRCOMPLETEDCALLBACK = void(__stdcall *)(LPCTSTR);
BOOL SearchFile(LPCTSTR root,
PSEARCHCALLBACK pFoundCallback,
PDIRCOMPLETEDCALLBACK pDirCompletedCallback,
int depthLevel = 0);
private:
int m_depthLevel; // -1 表示不限制深度
BOOL DirectoryExist(LPCTSTR lpszDir);
};
if (m_depthLevel > 0) {
if (++depthLevel > m_depthLevel) {
return FALSE; // 超過最大深度,終止遞歸
}
}
注意:depthLevel按值傳遞,各遞歸層級維護獨立副本,避免相互干擾。
HANDLE hFile = FindFirstFile(szPath, &stWFD);
if (hFile == INVALID_HANDLE_VALUE) return FALSE;
do {
if (strcmp(stWFD.cFileName, ".") && strcmp(stWFD.cFileName, "..")) {
sprintf(szFoundFile, "%s\\%s", root, stWFD.cFileName);
if (DirectoryExist(szFoundFile)) {
SearchFile(szFoundFile, pFoundCallback, pDirCompletedCallback, depthLevel);
}
if (pFoundCallback) pFoundCallback(szFoundFile); // 觸發文件回調
}
} while (FindNextFile(hFile, &stWFD));
FindClose(hFile);
if (pDirCompletedCallback) pDirCompletedCallback(root); // 目錄完成回調
void __stdcall OnFileFound(LPCTSTR path) {
if (StrStrI(path, _T(".tmp"))) DeleteFile(path);
}
void __stdcall OnDirCompleted(LPCTSTR dir) {
// 可在此檢查目錄是否為空並刪除
}
CSearchFile searcher(3); // 最多遞歸3層
searcher.SearchFile(_T("C:\\Temp"), OnFileFound, OnDirCompleted);
FindFirstFile/FindNextFile配合屬性判斷,兼容性強