来邮请发:[email protected]
大家一起学习.

解决方案 »

  1.   

    中文的肯定没有,你只有看DEMO和它自带的help了
      

  2.   

    没有TIdFTPServer.
    你想想,为什么Indy的Demo下有HttpServer, HttpClient, FingerServer, FingerClient
    FTPDemo下却只有FTPClient呢? 肯定是说FTPServer有难度嘛![:D]
      

  3.   

    program FTPServer_console;
    (*
    Sample of the usage of the TIdFtpServer component.
    Also shows how to use Indy in console appsCreated by: Bas Gooijen ([email protected])Disclaimer:
      Use it at your own risk, it could contain bugs.Copyright:
      Freeware for all use
    *){$APPTYPE console}
    uses
      Classes,
      windows,
      sysutils,
      IdFTPList,
      IdFTPServer,
      idtcpserver,
      IdSocketHandle,
      idglobal,
      IdHashCRC;type
      TFTPServer = class
      private
        { Private declarations }
        IdFTPServer: tIdFTPServer;
        procedure IdFTPServer1UserLogin( ASender: TIdFTPServerThread; const AUsername, APassword: string; var AAuthenticated: Boolean ) ;
        procedure IdFTPServer1ListDirectory( ASender: TIdFTPServerThread; const APath: string; ADirectoryListing: TIdFTPListItems ) ;
        procedure IdFTPServer1RetrieveFile( ASender: TIdFTPServerThread; const AFilename: string; var VStream: TStream ) ;
        procedure IdFTPServer1StoreFile( ASender: TIdFTPServerThread; const AFilename: string; AAppend: Boolean; var VStream: TStream ) ;
        procedure IdFTPServer1MakeDirectory( ASender: TIdFTPServerThread; var VDirectory: string ) ;
    //    procedure IdFTPServer1GetFileSize( ASender: TIdFTPServerThread; const AFilename: string; var VFileSize: Int64 ) ;
        procedure IdFTPServer1ChangeDirectory( ASender: TIdFTPServerThread; var VDirectory: string ) ;
    //    procedure IdFTPServer1CommandXCRC( ASender: TIdCommand ) ;
    //    procedure IdFTPServer1DisConnect( AThread: TIdPeerThread ) ;
      protected
        function TransLatePath( const APathname, homeDir: string ) : string;
      public
        constructor Create; reintroduce;
        destructor Destroy; override;
      end;constructor TFTPServer.Create;
    begin
      IdFTPServer := tIdFTPServer.create( nil ) ;
      IdFTPServer.DefaultPort := 21;
      IdFTPServer.AllowAnonymousLogin := False;
      IdFTPServer.EmulateSystem := ftpsUNIX;
      IdFTPServer.HelpReply.text := '帮助还没实现';
      IdFTPServer.OnChangeDirectory := IdFTPServer1ChangeDirectory;
      IdFTPServer.OnChangeDirectory := IdFTPServer1ChangeDirectory;
    //  IdFTPServer.OnGetFileSize := IdFTPServer1GetFileSize;
      IdFTPServer.OnListDirectory := IdFTPServer1ListDirectory;
      IdFTPServer.OnUserLogin := IdFTPServer1UserLogin;
      IdFTPServer.OnRetrieveFile := IdFTPServer1RetrieveFile;
      IdFTPServer.OnStoreFile := IdFTPServer1StoreFile;
      IdFTPServer.OnMakeDirectory := IdFTPServer1MakeDirectory;
      IdFTPServer.Greeting.Text.Text := '欢迎进入FTP服务器! ';
      IdFTPServer.Greeting.NumericCode := 220;
    //  IdFTPServer.OnDisconnect := IdFTPServer1DisConnect;
    //  with IdFTPServer.CommandHandlers.add do
    //  begin
    //    Command := 'XCRC';
    //    OnCommand := IdFTPServer1CommandXCRC;
    //  end;
      IdFTPServer.Active := true;
    end;
    {
    function CalculateCRC( const path: string ) : string;
    var
      f: tfilestream;
      value: dword;
      IdHashCRC32: TIdHashCRC32;
    begin
      IdHashCRC32 := nil;
      f := nil;
      try
        IdHashCRC32 := TIdHashCRC32.create;
        f := TFileStream.create( path, fmOpenRead or fmShareDenyWrite ) ;
        value := IdHashCRC32.HashValue( f ) ;
        result := inttohex( value, 8 ) ;
      finally
        f.free;
        IdHashCRC32.free;
      end;
    end;procedure TFTPServer.IdFTPServer1CommandXCRC( ASender: TIdCommand ) ;
    // note, this is made up, and not defined in any rfc.
    var
      s: string;
    begin
      with TIdFTPServerThread( ASender.Thread ) do
      begin
        if Authenticated then
        begin
          try
            s := ProcessPath( CurrentDir, ASender.UnparsedParams ) ;
            s := TransLatePath( s, TIdFTPServerThread( ASender.Thread ) .HomeDir ) ;
            ASender.Reply.SetReply( 213, CalculateCRC( s ) ) ;
          except
            ASender.Reply.SetReply( 500, 'file error' ) ;
          end;
        end;
      end;
    end;
    }
    destructor TFTPServer.Destroy;
    begin
      IdFTPServer.free;
      inherited destroy;
    end;function StartsWith( const str, substr: string ) : boolean;
    begin
      result := copy( str, 1, length( substr ) ) = substr;
    end;function BackSlashToSlash( const str: string ) : string;
    var
      a: dword;
    begin
      result := str;
      for a := 1 to length( result ) do
        if result[a] = '\' then
          result[a] := '/';
    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;