做遍历文件夹和里面的文件时,假设从data根目录开始遍历里面的文件夹,因为里面有的是三级的目录,有的是四级的目录,文件夹里的文件是txt文档格式。请问各位达人。如何遍历才能让treeview遍历出的不同级别的节点的txt文件中的文档内容显示在memo中。急求帮助!

解决方案 »

  1.   


    var
      FFileName: string;
    function GetDirectoryName(Dir: String): String;
    begin
      if Dir[Length(Dir)]<> '\' then
        Result := Dir+'\'
      else
        Result := Dir;
    end;procedure FindFiles(APath: String);
    var
      FSearchRec,
      DSearchRec: TSearchRec;
      FindResult: integer;  function IsDirNotation(ADirName: String): Boolean;
      begin
        Result := (ADirName = '.') or (ADirName = '..');
      end;begin
      APath := GetDirectoryName(APath);
      FindResult := FindFirst(APath+FFileName,faAnyFile+faHidden+
                              faSysFile+faReadOnly,FSearchRec);
      try
        while FindResult = 0 do
        begin
          form1.memo1.lines.add(LowerCase(APath+FSearchRec.Name));
          FindResult := FindNext(FSearchRec);
        end;    FindResult := FindFirst(APath+'*.*', faDirectory, DSearchRec);    while FindResult = 0 do
        begin
          if ((DSearchRec.Attr and faDirectory) = faDirectory) and not
            IsDirNotation(DSearchRec.Name) then
            FindFiles(APath+DSearchRec.Name);
          FindResult := FindNext(DSearchRec);
        end;
      finally
        FindClose(FSearchRec);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      FFileName:='*.txt';
      FindFiles('d:\');
    end;
      

  2.   

    大概需要用到以下代码//--递归查找文件
    procedure GetFile(PathName: string;var strings:TStrings);
    var
      FindData:TWin32FindData;
      hf:THandle;
      b:boolean;
      tmpstr:string;
      tempFolder:string;
      str:string;
    begin 
      hf:= Windows.FindFirstFile(PChar(PathName+'\*.*'),FindData);
      if hf = INVALID_HANDLE_VALUE then exit;
      b:= true;
      while b do
      begin
        if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)= 0 then
        begin
          str:=string(FindData.cFileName);
          //将找到的文件添加到tstring中,你可以过滤一下txt文件
          strings.Add( PathName+'\'+str );
        end
        else
        begin
          tmpstr:= FindData.cFileName+'';
          if (tmpstr <> '.') and (tmpstr<>'..')then
          begin
            tempFolder:=tempFolder+string(FindData.cFileName)+'\';
            GetFile(PathName+'\'+FindData.cFileName,strings);
          end;
        end;
        b:= windows.FindNextFile(hf,FindData);
      end;
    end;//---调用上面的查找文件过程
    var
      strings:TStrings;
    begin
      strings:=TStringList.Create;
      getFile('c"\123',strings);
      //--......
      strings.free;
    end;//----在memo中显示文本文件
    memo1.lines.loadfromfile('c:\123.txt');
      

  3.   

    1楼的代码只是遍历文件,将文件名写在memo中,打开文件你自己写吧
      

  4.   


    procedure  rSerach(const Directory: TFileName);
      var
          SearchRec:TSearchRec;
          ShortName,FullName:string;
      begin
        if FindFirst(Directory + '*',faAnyFile and not faVolumeID,SearchRec) = 0 then begin
        try
          repeat
            if SearchRec.FindData.cAlternateFileName[0] = #0   then
              ShortName   :=   SearchRec.Name
            else
              ShortName   :=   SearchRec.FindData.cAlternateFileName;
              FullName   :=   Directory+SearchRec.FindData.cFileName;//Directory   +   ShortName;
            if (SearchRec.Attr   and   faDirectory) <> 0 then
              begin
                if (ShortName <> '.') and (ShortName <> '..') then
                rSerach(FullName + '\');
              end
            else
            begin
              if UpperCase(ExpandFileExt(FullName))='TXT' then
              begin
                try
                  .......//
                except
                  Continue;
                end;
              end;
            end;
          until   FindNext(SearchRec)<>0;
        except
          FindClose(SearchRec);
          raise;
        end;
        FindClose(SearchRec);
      end;
    end;