首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C++可控深度文件遞歸搜索類實現與回調設計

     編輯:關於C

需求背景

在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);

設計要點總結

  • 雙回調機制:文件級與目錄級操作分離,支援複雜業務組合
  • 深度參數化:構造函數與遞歸參數雙重保障,靈活控制遍歷範圍
  • Windows API封裝:FindFirstFile/FindNextFile配合屬性判斷,兼容性強
  • 錯誤處理:句柄檢查、路徑拼接緩衝區保護,增強健壯性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved