本文針對 MFC 中 CTreeCtrl 類的遞歸應用進行深入解析,補充了先前文章中關於「遍歷未知層數目錄」的不足。透過深度優先搜尋(DFS)演算法,示範如何構建一個能夠遞歸掃描任意層級目錄結構並動態生成樹狀視圖的完整範例。
採用 MFC AppWizard 建立以對話框為基礎的專案框架,在對話框上放置一個 Tree Control 控制項,並建立對應的成員變數 m_Tree。核心邏輯封裝在遞歸函數 AddFile(CString StrPath, HTREEITEM faItem) 中,於 OnInitDialog() 初始化時調用,即可在程式啟動時自動顯示完整目錄樹。
針對目錄結構遍歷,遞歸演算法是自然的選擇。深度優先搜尋(DFS)與廣度優先搜尋(BFS)在時間複雜度上相同,但 DFS 僅需維護單一路徑的堆疊資訊,記憶體佔用更低,極適合處理深度未知的目錄樹。
以下為完整的 AddFile 實作碼,採用 CFileFind 進行檔案系統掃描:
void CFileTreeDlg::AddFile(CString StrPath, HTREEITEM faItem)
{
CFileFind OneFile;
CString FName, DirName;
BOOL BeWorking;
HTREEITEM NewItem;
DirName = StrPath + _T("\\*.*");
BeWorking = OneFile.FindFile(DirName);
while (BeWorking)
{
BeWorking = OneFile.FindNextFile();
// 處理子目錄(排除 "." 與 "..")
if (OneFile.IsDirectory() && !OneFile.IsDots())
{
DirName = OneFile.GetFilePath();
FName = OneFile.GetFileTitle();
NewItem = m_Tree.InsertItem(FName, faItem);
AddFile(DirName, NewItem); // 遞歸進入下一層
}
// 處理檔案
if (!OneFile.IsDirectory() && !OneFile.IsDots())
{
FName = OneFile.GetFileTitle();
m_Tree.InsertItem(FName, faItem);
}
}
OneFile.Close(); // 釋放資源
}
FindFirstFile/FindNextFile 的 Win32 API 呼叫,自動處理句柄管理。faItem 於遞歸時向下傳遞,確保子節點正確掛載至對應父節點下。Close(),釋放 CFileFind 內部持有的搜尋句柄。程式可正確展開任意層級的目錄結構,測試環境為 VC6 Professional + SP5,作業系統 Windows 2000 Professional。執行畫面如下:

本範例展示了 MFC 中利用 CTreeCtrl 搭配遞歸演算法實現多層目錄樹遍歷的標準作法。深度優先搜尋邏輯清晰、記憶體效率佳,且程式碼結構簡潔,極適合作為檔案管理、專案瀏覽等功能的基礎模組。開發者可依據實際需求擴充圖示顯示、右鍵選單、拖放操作等進階功能。