unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ScktComp,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure SendFtpCmd(socket: TClientSocket; cmd: string; const Value: string = '');
    procedure ClientSocketRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocketError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    function GetFtpRetValue(RetStr: string): Integer;
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  FCmdSocket, FDataSocket: TClientSocket;
implementation{$R *.dfm}procedure TForm1.SendFtpCmd(socket: TClientSocket; cmd: string; const Value: string = '');
begin
  if not socket.Active then
    socket.Open;
  socket.Socket.SendText(Format('%s %s'#13#10, [cmd, Value]));
end;procedure TForm1.Button1Click(Sender: TObject);
var ReceiveText: string;
begin
  FCmdSocket := TClientSocket.Create(self);
  FCmdSocket.OnRead := ClientSocketRead;
  FCmdSocket.OnError := ClientSocketError;
  FCmdSocket.Host := '192.168.1.55';
  FCmdSocket.Port := 21;
  FCmdSocket.Open;
end;procedure TForm1.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var ReceiveText: string;
  FileStream: TFileStream;
  ReadWriteThread: TThread;
  SocketDataStream: TWinSocketStream;
begin
  ReceiveText := Socket.ReceiveText;
  case GetFtpRetValue(ReceiveText) of
    220:
    //服务就绪,可以执行新用户请求
      SendFtpCmd(FCmdSocket, 'USER', '01');
    331: //用户名正确,需要密码。发送密码命令
      SendFtpCmd(FCmdSocket, 'PASS', '02');
    230: //请求的操作正确,已完成。改变传输模式为二进制
      SendFtpCmd(FCmdSocket, 'TYPE', 'i');
    200: //命令成功确定修改成被动方式
      SendFtpCmd(FCmdSocket, 'PASV');
    227:
      begin
        SendFtpCmd(FCmdSocket, 'STOR', 'D:\a.txt');
      end;
  end;
end;procedure TForm1.ClientSocketError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
var
  errMsg: string;
begin
  case ErrorEvent of
    eeGeneral: ;
    eeSend: errMsg := '发送数据失败';
    eeReceive: errMsg := '返回数据失败';
    eeConnect: errMsg := '连接错误';
    eeDisconnect:
      begin
        errMsg := '连接已经关闭';
      end;
    eeAccept: errMsg := '接受请求失败';
    eeLookup: ;
  end;
  Application.MessageBox(PChar(errMsg), '错误', 16);
  ErrorCode := 0;
end;function TForm1.GetFtpRetValue(RetStr: string): Integer;
begin
  if not TryStrToInt(copy(Retstr, 1, 3), Result) then
    Result := 0;
end;end. 
为什么运行完SendFtpCmd(FCmdSocket, 'STOR', 'D:\a.txt');  ReceiveText返回 '550 a.txt: Cannot create file.'#$D#$A