用递归的方法把某个目录填充到TTreeView控件.
以下的代码演示了如何将指定的目录及其子目录和文件添加的树控件上.有详细的注释,方便像我一产的初学者.
注意,此代码没有把指定目录下的文件添加到树控件上,只是把子目录的文件添加上去了,有兴趣的朋友可以试下,呵呵.
void __fastcall TMyThread::FillTreeview(String TopDirectoryString,TTreeNode * TopNode)
{
//获取所有子目录
TStringDynArray FolderList=TDirectory::GetDirectories(TopDirectoryString);
//指定当前的父级TTreeNode
TTreeNodes *Parent=TopNode->Owner;
TTreeNode *SubNode;
int iPos;
for(int i=0;i<FolderList.Length;i++)
{
String Path;
String Folder;
Path=String(FolderList);
//得到最右边\在字符串中的位置
iPos=LastDelimiter('\\',Path);
//得到文件夹名称,注意,不是完整路径
Folder=Path.SubString(iPos+1,Path.Length()-iPos+1);
//排除回收站等系统文件夹
if((Folder!="$RECYCLE.BIN")&&(Folder!="RECYCLER")&&(Folder!="System Volume Information"))
{
//在父级树中增加子节点
SubNode=Parent->AddChild(TopNode,Path);
SubNode->Text=Folder;
//递归调用本函数
FillTreeview(Path,SubNode);
int nPos;
//获取当前目录下的所有文件
TStringDynArray FileList=TDirectory::GetFiles(Path);
for(int n=0;n<FileList.Length;n++)
{
String FullFileName;
String FileName;
FullFileName=String(FileList[n]);
nPos=LastDelimiter('\\',FullFileName);
//得到文件名,注意,不是完整文件名
FileName=FullFileName.SubString(nPos+1,FullFileName.Length()-nPos+1);
SubNode->Owner->AddChild(SubNode,FileName);
}
//折叠
SubNode->Collapse(true);
//展开
TopNode->Expand(true);
}
}
}
//---------------------------------------------------------------------------
//调用
void __fastcall TMyThread::Action(void)
{
MainForm->tv->Items->Clear();
MainForm->tv->AutoExpand=true;
MainForm->tv->Color=RGB(random(255),random(255),random(255));
MainForm->tv->Items->Add(NULL,"Root");
TTreeNodes *Root =MainForm->tv->Items ;
//FillTreeview("E:\\Driver\\Thinkpad\\T61[VISTA]",Root->Item[0]); //
this->FillTreeview("W:\\FREE_RTOS",Root->Item[0]);
//this->FillTreeview("D:\\",Root->Item[0]);
}
<梅川酷子原创>
文章评论(0条评论)
登录后参与讨论