请问怎样读取一个指定路径下的所有文件,前提是文件数量和名称都不知道,同时也包括子目录下的文件???

解决方案 »

  1.   

    var
      FileAttrs: Integer;
      sr: TSearchRec;
      sDir: string;
    begin
      FileAttrs := FileAttrs + faAnyFile;
      sDir := GetCurrentDir + '\Temp\';
      if FindFirst(sDir + '*.txt', FileAttrs, sr) = 0 then
      begin
        repeat
          if (sr.Name <> '') then
          begin
            with Dm.ADOQry do
            begin
              close;
              sql.Clear;
              sql.Add('insert into Ftp_Files(File_Name) values(''' + sr.Name + ''')');
              ExecSQL;
            end;
          end;
          Application.ProcessMessages;
        until FindNext(sr) <> 0;
        FindClose(sr);
      end;
    end;参考一下
      

  2.   

    procedure SearchFileEx(const Dir, Ext: string; Files: TStrings);
    var
      Found: TSearchRec;
      i: integer;
      Dirs: TStrings;
      Finished: integer;
      StopSearch: Boolean;
    begin
      StopSearch := False;
      Dirs := TStringList.Create;
      Finished := FindFirst(Dir + '*.*', 63, Found);
      while (Finished = 0) and not (StopSearch) do
      begin
        if (Found.Name <> '.') then
        begin
          if (Found.Attr and faDirectory) = faDirectory then
            Dirs.Add(Dir + Found.Name)
          else
            if Pos(UpperCase(Ext), UpperCase(Found.Name)) > 0 then
              Files.Add(Dir + Found.Name);
        end;
        Finished := FindNext(Found);
      end;
      FindClose(Found);
      if not StopSearch then
        for i := 0 to Dirs.Count - 1 do
          SearchFileEx(Dirs[i], Ext, Files);
      Dirs.Free;
    end;
      

  3.   

    1. 获取当前目录下的所有下一级子目录,2. 存入字符串列表中(Tstrings)。
    其中,用到了几个API函数。
    FindFirst是找出指定目录下第一个文件或目录。
    FindNext一般和FindFirst配合使用,用来找出下一个文件或目录。
    FindClose用来关闭查询。
    (以上函数Delphi在线帮助中有详尽解释,在此不赘述);
    3. 用FileExists函数查找当前目录,
    4. 寻找是否有满足条件的文件存在。
    5. 依次使各个子目录成为当前目录,
    6. 递归调用本函数。
    7. 释放资源,
    8. 返回查询结果。代码如下:
    1. 从搜索记录中判断是否是子目录。
    function IsValidDir(SearchRec:TSearchRec):Boolean;
    begin
    if (SearchRec.Attr=16) and(SearchRec.Name<>'.') and(SearchRec.Name<>'..') then
    Result:=True
    else
    Result:=False;
    end;2. 这是查询主体函数。参数介绍:Mainpath: 指定的查询目录。
    Filename: 欲查询的文件。
    Foundresult: 返回的含完整路径的匹配文件(可能有多个)。
    如果有匹配文件,函数返回True,否则,返回False;
    function SearchFile(mainpath:string;filename:string;
    var foundresult:TStrings):Boolean;
    var i:integer;
    Found:Boolean;
    subdir1:TStrings;
    searchRec:TsearchRec;
    begin
    found:=false;
    if Trim(filename)<>'' then
    begin
    subdir1:=TStringList.Create;//字符串列表必须动态生成
    //找出所有下级子目录。
    if (FindFirst(mainpath+'*.*', faDirectory, SearchRec)=0) then
    begin
    if IsValidDir(SearchRec) then
    subdir1.Add(SearchRec.Name);
    while (FindNext(SearchRec) = 0) do
    begin
    if IsValidDir(SearchRec) then
    subdir1.Add(SearchRec.Name);
    end;
    end;
    FindClose(SearchRec);
    //查找当前目录。
    if FileExists(mainpath+filename) then
    begin
    found:=true;
    foundresult.Add(mainpath+filename);
    end;
    //这是递归部分,查找各子目录。
    for i:=0 to subdir1.Count-1 do
    found:=Searchfile(mainpath+subdir1.Strings[i]+
    '\',Filename,foundresult)or found;
    //资源释放并返回结果。
    subdir1.Free;
    end;
    result:=found;
    end;