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

C++ Builder 遍歷檔案目錄樹 (FindFirst/FindNext 遞迴)

     編輯:VC 教學

目標

建立類似總管的目錄樹,列出所有磁碟機及其子目錄。使用 TTreeView + TImageList,核心 API 為 FindFirst/FindNext/FindClose 遞迴掃描。

關鍵類型

typedef enum { dtUnknown, dtNoDrive, dtFloppy, dtFixed, dtNetwork, dtCDROM, dtRAM } TDriveType;
// 來源於 TDirectoryComboBox 內部使用的 TDriveType,非公開文件化

磁碟機類型判斷用 WinAPI GetDriveType (回傳上述枚舉值)。

核心函數

初始化目錄樹

bool __fastcall TForm1::InitDirectoryTree()
{
    DriveCount = GetAllDrive(); // 取得磁碟機數量
    DriveType = new TDriveType[DriveCount+1];
    for (int i = DriveCount; i > 0; i--) {
        TTreeNode *node = DirTree->Items->Item[i];
        DriveType[i] = (TDriveType)GetDriveType(node->Text.c_str());
        switch (DriveType[i]) {
            case dtFloppy: case dtFixed: case dtNetwork: case dtCDROM: case dtRAM:
                BrowseDirectory(node->Text, node); break; // 遞迴掃描
        }
    }
    return true;
}

遞迴瀏覽目錄

void __fastcall TForm1::BrowseDirectory(AnsiString Dir, TTreeNode *Node)
{
    TSearchRec sr;
    TTreeNode *subNode;
    if (FindFirst(Dir + "*.*", faDirectory, sr) == 0) {
        do {
            if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..") {
                subNode = DirTree->Items->AddChild(Node, sr.Name);
                BrowseDirectory(Dir + sr.Name + "\\", subNode); // 遞迴
            }
        } while (FindNext(sr) == 0);
        FindClose(sr);
    }
}

應用延伸

可將上述邏輯封裝為自訂 VCL 元件,替代 TDirectoryListBox/TDirectoryComboBox,提供更現代 (Win9x 風格) 的目錄瀏覽介面。

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