要求对指定目录下的文件
指定目录
  │┌──目录 │─子目录 
  ││     │     │─文件(满足条件的)
  │┥──目录─┤─子目录─┤─文件(..)
   │     │     │─  …………
   │──目录 │─子目录………………
      │     │─文件(..)
      │          │─文件(..)
      │──文件(..)  …………………………只要能完成上面三层的遍历就行了,当然更多层更好。已经完成了指定目录下对目录和文件的查找。然而在查找下一层的子目录和文件时发生了一点问题,看我的源码(查找子目录跟文件的过程)procedure TMainForm.MakeChild(TreeNode: TfcTreeNode);
var
  SearchRec: TSearchRec;
  ChildNode: TfcTreeNode;
begin
  if FindFirst('*.*', $37, SearchRec) = 0 then
    if ((SearchRec.Attr and faDirectory) = 0) and
      (UpperCase(ExtractFileExt(SearchRec.Name))= '.TXT')then
    begin
      ChildNode := tvMain.Items.AddChild(tvMain.Selected,
        Copy(SearchRec.Name, 1, Length(SearchRec.Name) - 4));
      ChildNode.StringData := ExpandFileName(SearchRec.Name);
    end;
    if ((SearchRec.Attr and faDirectory) = faDirectory) and
        (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
      begin
        ChildNode := tvMain.Items.AddChild(tvMain.Selected, SearchRec.Name);
        ChildNode.ImageIndex := 0;
        ChildNode.SelectedIndex := 1;
      end;
  while (FindNext(SearchRec) = 0) do
    if (SearchRec.Attr and faDirectory) = 0) and
      (UpperCase(ExtractFileExt(SearchRec.Name)) = '.TXT')then
    begin
      ChildNode := tvMain.Items.AddChild(tvMain.Selected,
        Copy(SearchRec.Name, 1, Length(SearchRec.Name) - 4));
      ChildNode.StringData := ExpandFileName(SearchRec.Name);
    end;  //去掉;
//else         
    if ((SearchRec.Attr and faDirectory) = faDirectory) and
        (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
      begin
        ChildNode := tvMain.Items.AddChild(tvMain.Selected, SearchRec.Name);
        ChildNode.ImageIndex := 0;
        ChildNode.SelectedIndex := 1;
        ChildNode.Selected := True;
        ChDir(SearchRec.Name);
        MakeChild(ChildNode);
        ChDir('..');
      end;
  FindClose(SearchRec);
end;如果按照上面的执行,那么只能找到一个子目录以及它下面的文件。如果按照注释里面的修改后执行,能查找到所有子目录跟文件 但是所有的子目录及其下的文件甚至目录下的一些文件都归结到一个子目录的节点下面。 哪位高手看看能不能改一下,或者另给出一个完整例程。

解决方案 »

  1.   

    uses ShellApi, FileCtrl;function GetSystemImageList(mImageList: TImageList): Boolean;
    { 返回系统图标到图形列表中是否成功 }
    var
      vHandle: THandle;
      vSHFileInfo: TSHFileInfo;
    begin
      FillChar(vSHFileInfo, SizeOf(vSHFileInfo), 0);
      vHandle := SHGetFileInfo('', 0, vSHFileInfo, SizeOf(vSHFileInfo),
        SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
      Result := vHandle <> 0;
      mImageList.Handle := vHandle;
      mImageList.ShareImages := True;
    end; { GetSystemImageList }function GetIconIndex(mPath: string): Integer;
    { 返回文件或路径所对应的图标序号 }
    var
      vSHFileInfo: TSHFileInfo;
    begin
      FillChar(vSHFileInfo, SizeOf(vSHFileInfo), 0);
      SHGetFileInfo(PChar(mPath), 0, vSHFileInfo, SizeOf(vSHFileInfo),
        SHGFI_SYSICONINDEX);
      Result := vSHFileInfo.iIcon;
    end; { GetIconIndex }procedure PathToTreeNode(mDirName: string; mTreeView: TTreeView;
      mTreeNode: TTreeNode);
    { 返回目录转换成菜单项是否成功 }
    var
      vSearchRec: TSearchRec;
      vPathName: string;
      K: Integer;
      vTreeNode: TTreeNode;
    begin
      if not Assigned(mTreeView) then Exit;
      vPathName := mDirName + '\*.*';
      K := FindFirst(vPathName, faAnyFile, vSearchRec);
      while K = 0 do begin
        if (vSearchRec.Attr and faDirectory <> 0) and
          (Pos(vSearchRec.Name, '..') = 0) then begin
          vTreeNode := mTreeView.Items.AddChild(mTreeNode, vSearchRec.Name);
          vTreeNode.ImageIndex := GetIconIndex(mDirName + '\' + vSearchRec.Name);
          PathToTreeNode(mDirName + '\' + vSearchRec.Name, mTreeView, vTreeNode)
        end else if (Pos(vSearchRec.Name, '..') = 0) then begin
          vTreeNode := mTreeView.Items.AddChild(mTreeNode, '[' + vSearchRec.Name + ']');
          vTreeNode.ImageIndex := GetIconIndex(mDirName + '\' + vSearchRec.Name);
        end;
        K := FindNext(vSearchRec);
      end;
      FindClose(vSearchRec);
    end; { PathToTreeNode }procedure TForm1.FormCreate(Sender: TObject);
    begin
      GetSystemImageList(ImageList1);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      vDirectory: string;
    begin
      if not SelectDirectory('Select Directory', '', vDirectory) then Exit;
      TreeView1.Items.BeginUpdate;
      try
        TreeView1.Items.Clear;
        PathToTreeNode(vDirectory, TreeView1, TreeView1.TopItem);
      finally
        TreeView1.Items.EndUpdate;
      end;
    end;
      

  2.   

    to zswang(伴水清清)(专家门诊清洁工) 
    你的代码编译通不过,获取图标和转换成菜单项是什么意思。
    初学delphi,请解释清楚一些好吗。
      

  3.   

    uses ShellApi, FileCtrl; ///////////////要把单元加上~~
    你的代码,把
    “.AddChild(tvMain.Selected,”
    替换成:
    “.AddChild(TreeNode,”
      

  4.   

    谢谢zswang(伴水清清)(专家门诊清洁工) 根据你所说的修改并把注释去掉,程序已可正常运行 多人接受答案。