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

VC++ CTreeCtrl 遞歸實現多層目錄樹遍歷完整指南

     編輯:關於VC++

本文針對 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(); // 釋放資源
}

關鍵技術點解析

  • CFileFind 封裝:簡化了 FindFirstFile/FindNextFile 的 Win32 API 呼叫,自動處理句柄管理。
  • HTREEITEM 傳遞:父節點項目代碼 faItem 於遞歸時向下傳遞,確保子節點正確掛載至對應父節點下。
  • IsDots() 過濾:排除當前目錄(.)與上層目錄(..),避免無限遞歸。
  • 資源釋放:迴圈結束後必須呼叫 Close(),釋放 CFileFind 內部持有的搜尋句柄。

執行結果與適用環境

程式可正確展開任意層級的目錄結構,測試環境為 VC6 Professional + SP5,作業系統 Windows 2000 Professional。執行畫面如下:

總結

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved