如何显示当前驱动器的目录结构与内容?

jxpjb 2001-12-07 02:55:06
...全文
66 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxpjb 2001-12-07
  • 打赏
  • 举报
回复
我当然十分想要,我的邮件地址:jxpjb@sohu.com 谢了!(不知能否读取文件的图标?)
csz_cmy 2001-12-07
  • 打赏
  • 举报
回复
这是我的软件“文件管理器”的一部分TTreeView。
他能列出所有驱动器的所有文件夹!
还有TListView的文件列表这里没有。需要请联系。
csz_cmy 2001-12-07
  • 打赏
  • 举报
回复
void TMainForm::UpDataTree(void) //TTreeView:FromTree 在Form Create调用
{
int Drives=GetLogicalDrives();
Char *DriveRoot="A:\\";
char *DriveStr="A:";
int DriveF;
char Volume[256];
unsigned long SNo,Len,Flag;
TTreeNode *Node;
FromTree->Items->Clear();
for(int i=0;i<26;i++)
if((Drives>>i)&0x01)
{
DriveRoot[0]='A'+i;
DriveStr[0]=DriveRoot[0];
DriveF=GetDriveType(DriveRoot);
if(DriveF>=2&&DriveF<=6)
{
if(DriveF==2) StrCopy(Volume,"软盘");
else if(DriveF==6) StrCopy(Volume,"内存");
else GetVolumeInformation(DriveRoot,Volume,256,&SNo,&Len,&Flag,NULL,0);
Node=FromTree->Items->Add(NULL,AnsiString(Volume)+"("+DriveStr+")");
Node->ImageIndex=DriveF-2;
Node->SelectedIndex=DriveF-2;
FromTree->Items->AddChild(Node," ");
}
}
}
//---------------------------------------------------------------------------
bool NodeIsRoot(TTreeNode *Node)
{
return Node->Level==0;
}
AnsiString NodeToDir(TTreeNode *Node)
{
if(NodeIsRoot(Node)) return(NodeToStr(Node)+"\\");
return(NodeToDir(Node->Parent)+NodeToStr(Node)+"\\");
}
//---------------------------------------------------------------------------
void HasChildDir(TTreeNode *Node)
{
TSearchRec SRec;
if(FindFirst(NodeToDir(Node)+"*.*",faDirectory,SRec)==0)
{
if(SRec.Attr==faDirectory&&SRec.Name!="."&&SRec.Name!="..")
{
((TTreeView *)(Node->TreeView))->Items->AddChild(Node," ");
FindClose(SRec); return;
}
while(FindNext(SRec)==0)
if(SRec.Attr==faDirectory&&SRec.Name!="."&&SRec.Name!="..")
{
((TTreeView *)(Node->TreeView))->Items->AddChild(Node," ");
FindClose(SRec); return;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Expanding(TObject *Sender, TTreeNode *Node,
bool &AllowExpansion) //OnAExpanding 事件映射
{
TSearchRec SRec;
bool HasChild=false;
TTreeNode *CurNode;
TTreeNodes *Nodes=((TTreeView *)(Node->TreeView))->Items;
if(NodeIsRoot(Node)==false) Node->DeleteChildren();
if(FindFirst(NodeToDir(Node)+"*.*",faDirectory,SRec)==0)
{ if(SRec.Attr==faDirectory&&SRec.Name!="."&&SRec.Name!="..")
{
HasChild=true;
if(NodeIsRoot(Node)) Node->DeleteChildren();
CurNode=Nodes->AddChild(Node,SRec.Name);
CurNode->ImageIndex=5;
CurNode->SelectedIndex=6;
HasChildDir(CurNode);
}
while(FindNext(SRec)==0)
if(SRec.Attr==faDirectory&&SRec.Name!="."&&SRec.Name!="..")
{
if(HasChild==false)
{
HasChild=true;
if(NodeIsRoot(Node)) Node->DeleteChildren();
}
CurNode=Nodes->AddChild(Node,SRec.Name);
CurNode->ImageIndex=5;
CurNode->SelectedIndex=6;
HasChildDir(CurNode);
}
}
FindClose(SRec);
AllowExpansion=HasChild;
}
//---------------------------------------------------------------------------

AnsiString DirFolder(AnsiString &Dir)//逐层分离
{
int Pos=Dir.Pos("\\");
AnsiString Folder;
if(Pos==0)
{
Folder=Dir; Dir="";
return(Folder);
}
Folder=Dir.SubString(1,Pos-1);
Dir=Dir.SubString(Pos+1,Dir.Length()-Pos);
return(Folder);
}
void TMainForm::TreeSetDir(TTreeView *Tree,AnsiString Dir)//请调用
{
TTreeNodes *Nodes=Tree->Items;
TTreeNode *Node;
AnsiString Folder=DirFolder(Dir);
for(int i=0,j;i<Nodes->Count;i++)
{
Node=Nodes->Item[i];
if(Folder==NodeToStr(Node).UpperCase())
{
Node->Expanded=true;
while((Folder=DirFolder(Dir))!="")
{
for(j=0;j<Node->Count;j++)
if(Folder==NodeToStr(Node->Item[j]).UpperCase()) break;
if(j==Node->Count) break;
Node=Node->Item[j];
Node->Expanded=true;
}
Tree->Selected=Node;
return;
}
}
}
ciml 2001-12-07
  • 打赏
  • 举报
回复
专业的做法是shell编程
jxpjb 2001-12-07
  • 打赏
  • 举报
回复
我只能使用Win3.1下的控件

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧