利用C++Builder我們可以輕松地實現類似Windows的Explorer的目錄樹。OK,Let's go.
我們需要一個TTree和一個TImageList控件。如何獲得系統的盤符呢?Borland給我們提供了一個TDriveType類,什麼?幫助裡找不到,呵呵,這是實現TDirectoryComboBox用到的一個類,幫助裡當然沒有了,它的定義如下:
typedef enum ATTR { atDirectory,atFile} Attr;
struct ITEMPROPERTY
{
Attr ItemAttr;
}ItemProperty;
typedef enum TDRIVETYPE {dtUnknown, dtNoDrive, dtFloppy, dtFixed, dtNetwork, dtCDROM,dtRAM}TDriveType;
那麼如何知道這些盤符是軟驅是硬盤呢?這就需要用到WinAPI函數GetDriveType了。定義如下:
UINT GetDriveType(LPCTSTR lpRootPathName); 具體內容請大家參考幫助文檔,我就不在這兒耽誤大家時間了。最後我們利用BCB的FindFirst,FindNext等函數就可以實現對目錄的遍歷了。
下面的兩個函數InitDriectoryTree用來獲得盤符和它們的屬性,BrowseDriectory采用遞歸法實現對目錄的遍歷,具體實現如下:
bool __fastcall TForm1::InitDirectoryTree()
{
DriveCount=GetAllDrive();
DriveType=new TDriveType[4];
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: BrowseDirectory(Node->Text,Node);break;//硬盤
case dtNetwork: BrowseDirectory(Node->Text,Node);break;//網絡驅動器
case dtCDROM: //光驅
case dtRAM: BrowseDirectory(Node->Text,Node);break; //內存虛擬盤?不大明白,可能像Win98啟動盤生成的那個E:盤一樣
};
}
return true;
//TODO: Add your source code here
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BrowseDirectory(AnsiString Dir, TTreeNode* Node)
{
TSearchRec sr;
TTreeNode* SubNode=Node;
if(FindFirst(Dir+"*.*",faDirectory,sr)==0)
while(1)
{ if(sr.Attr==faDirectory&&sr.Name!="."&&sr.Name!="..")
{
SubNode=DirTree->Items->AddChild(Node,sr.Name);
BrowseDirectory(Dir+sr.Name+"\\",SubNode);
}
if(FindNext(sr)!=0) break;
}
FindClose(sr);
return;
//TODO: Add your source code here
}
//---------------------------------------------------------------------------
以上我們利用C++Builder實現了對計算機文件系統的訪問,實際上我們可以利用上面的函數創建一個可以訪問文件系統的VCL控件來代替BCB提供的TDirectoryListbox和TDirectoryComboBox,使你的程序更具有Win9X的風格。