列出文件的代码如下:procedure TFTPServer.IdFTPServer1ListDirectory( ASender: TIdFTPServerThread; const APath: string; ADirectoryListing: TIdFTPListItems ) ;  procedure AddlistItem( aDirectoryListing: TIdFTPListItems; Filename: string; ItemType: TIdDirItemType; size: int64; date: tdatetime ) ;
  var
    listitem: TIdFTPListItem;
  begin
    listitem := aDirectoryListing.Add;
    listitem.ItemType := ItemType;
    listitem.FileName := Filename;
    listitem.OwnerName := 'anonymous';
    listitem.GroupName := 'all';
    listitem.OwnerPermissions := '---';
    listitem.GroupPermissions := '---';
    listitem.UserPermissions := '---';
    listitem.Size := size;
    listitem.ModifiedDate := date;
  end;var
  f: tsearchrec;
  a: integer;
begin
  ADirectoryListing.DirectoryName := apath;  a := FindFirst( TransLatePath( apath, ASender.HomeDir ) + '*.*', faAnyFile, f ) ;问题就出在这句,为什么要TransLatePath?是不是Ftp用的目录和Window用的目录不样?
  while ( a = 0 ) do
  begin
    if ( f.Attr and faDirectory > 0 ) then
      AddlistItem( ADirectoryListing, f.Name, ditDirectory, f.size, FileDateToDateTime( f.Time ) )
    else
      AddlistItem( ADirectoryListing, f.Name, ditFile, f.size, FileDateToDateTime( f.Time ) ) ;
    a := FindNext( f ) ;
  end;  FindClose( f ) ;
end;function TFTPServer.TransLatePath( const APathname, homeDir: string ) : string; 
var 
  tmppath: string; 
begin 
  result := SlashToBackSlash( homeDir ) ; 
  tmppath := SlashToBackSlash( APathname ) ; 
  if homedir = '/' then 
  begin 
    result := tmppath; 
    exit; 
  end;   if length( APathname ) = 0 then 
    exit; 
  if result[length( result ) ] = '\' then 
    result := copy( result, 1, length( result ) - 1 ) ; 
  if tmppath[1] <> '\' then 
    result := result + '\'; 
  result := result + tmppath; 
end; function SlashToBackSlash( const str: string ) : string; 
var 
  a: dword; 
begin 
  result := str; 
  for a := 1 to length( result ) do 
    if result[a] = '/' then 
      result[a] := '\'; 
end;