遍历子目录问题:如何获得最深一层子目录的全路径?

Description of your first forum.

遍历子目录问题:如何获得最深一层子目录的全路径?

帖子eaglepsm » 星期日, 2004年10月31日 06:01


我只知道要用递归,但不知道代码怎么写,以下是我拷贝别人的代码,修改了一下,但不能实现我所需要的功能(只显示最深一层子目录的全路径)
program deepdir;
{$APPTYPE CONSOLE}
uses
 SysUtils,Classes;
FUNCTION show_deep_tree(vFolder:STRING):Boolean;
VAR
 srList: TSearchRec;
 DirList: TStringList;
 oFound: Boolean;
 i,frt: integer;
BEGIN
 // 建立一个文件夹列表
 DirList := TStringList.Create;
 vFolder:=TRIM(vFolder);
 IF vFolder[length(vFolder)]<>'\' THEN  vFolder:=vFolder + '\';
  // 生成文件夹列表
 oFound:=FindFirst(vFolder+'*.*',(faDirectory+faHidden+faSysFile), srList) = 0;
 WHILE oFound DO
   BEGIN
   IF (DirectoryExists(vFolder+srList.Name) and (srList.Name<>'.') AND (srList.Name<>'..'))  THEN
   begin
     DirList.Add(vFolder+srList.Name);
     writeln(extractfilepath(vFolder+srList.Name)); //想得到目录全路径,但不知道怎么写
   end;
   oFound :=(FindNext(srList)=0);
   END;
 FindClose(srList);
 //查找当前目录的文件删除
 //oFound:=FindFirst(vFolder+'*.*',(faAnyFile+faHidden+faSysFile+faReadOnly), srList) = 0;
 FindClose(srList);
 //查找列表的子目录
 FOR i := 0 TO DirList.Count-1 DO
   show_deep_tree(DirList[i]);
 FileSetAttr(vFolder,0);
 DirList.Free;
END;
//--------------------------------------------------------------
begin
   if paramcount=0 then
       writeln('请输入参数.')
   else
       show_deep_tree(ParamStr(1));
end.
 
 
 

遍历子目录问题:如何获得最深一层子目录的全路径?

帖子eaglepsm » 星期日, 2004年10月31日 22:31


好像递归不行,递归函数无法判断是否已经到达最深一层目录,不知道我的想法是否正确
 
 
 

遍历子目录问题:如何获得最深一层子目录的全路径?

帖子Cowboy Blues » 星期日, 2004年10月31日 22:42


其实只要FindFirst和FindNext就可以实现。代码不用你写得那么繁。
递归是要的,写在if FindFirst =0 ......后面
 
 
 

遍历子目录问题:如何获得最深一层子目录的全路径?

帖子eaglepsm » 星期日, 2004年10月31日 23:13


我改了一下,但只能显示最深一层子目录的文件,不能只显示目录全路径,将原来的
 FOR i := 0 TO DirList.Count-1 DO
   show_deep_tree(DirList[i]);
 FileSetAttr(vFolder,0);
 DirList.Free;
改成
 FOR i := 0 TO DirList.Count-1 DO
   show_deep_tree(DirList[i]);
 if (DirList.Count=0)  then
    writeln(GetCurrentDir+'\'+vFolder+srList.Name);
 FileSetAttr(vFolder,0);
 DirList.Free;
 
 
 

遍历子目录问题:如何获得最深一层子目录的全路径?

帖子eaglepsm » 星期日, 2004年10月31日 23:39


我晕,问题已解决,将上面的
writeln(GetCurrentDir+'\'+vFolder+srList.Name);
改成
writeln(GetCurrentDir);
就行了