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
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
不应该写在一个button单击事件里。我有完全的代码实现文件发送,但希望你能给贴子加点分。