Delph IDTCP的用法

忘记在哪看的了,转来学习。

 

FTP是一个标准协议,它是在计算机和网络之间交换文件的最简单的方法。

FTP也是应用TCP/IP协议的应用协议标准。
FTP通常于将作者的文件上传至服务器,或从服务器上下传文件的一种普遍的使用方式作为用户,您可以用非常简单的DOS界面来使用FTP,也可以使用由第三方提供的软件(如FLASHFXP)来对服务器的数据进行删除,重命名等操作。 
当然,使用这些之前,必须先要登录服务器,用指定的用户名和密码或匿名(Anonymous)登录。 
这些大家都知道,不过还是讲一下。用DOS操作FTP我不讲了。我今天主要用INDY组件里的IDFTP控件做一FTP客户端软件(非常简单 ) 了 
我现在讲一下IDFTP控件的几个属性如下: 
Host:FTP服务器地址。
USER:用户帐号。
Password:密码。
Passive:用于控制FTP数据连接方法。FTP的数据传输可以有主动和被动。
PORT是主动模式,在建立数据通道时,服务端去连接别人;
PASV是被动模式,在建立数据通道时,服务端被别人连接;
建立数据通道时,用PORT模式还是PASV模式,选择权在于FTP客户端。
IDFTP里的passive是一个Boolean数据类型。当True时为主动;当false时为被动。
Port:FTP服务的默认端口是21。
TransferType:传输文件的类型,可以取值为FtBinary(8位的任意文件)和FtAscii(7位的文本文件)。
SystemDesc:FTP服务器的描述。 
IDFTP的几个方法
常用的方法有以下几个:
Connect:连接FTP服务器.
Abort:停止FTP服务的操作。
Quit:关闭客户端与服务器的连接.
Noop:用于保持连接的命令,防止被服务器关掉连接.
List:获取FTP服务器上的文件和目录列表.
原型为
procedure List(ADest:TStrings;Const ASpecifier:String;const ADetails:Boolean);
RetrieveCurrentDir:取得当前目录的名称.
Site:发送FTP服务器的命令.
原型为:
procedure Site(const ACommand:string);
ChangeDir:改变FTP服务器上的当前目录
原型为: procedure ChangeDir(const ADirName:string);
ChangeDirUp:将FTP服务器上的目录返回到你目录. 
温州-Dillon(86695893) 13:08:26
MakeDir:在服务器上建立一个新目录.
原型为:
procedure MakeDir(const ADirName:String);
RemoveDir:删除服务器上的一个目录.
原型为:
procedure RemoveDir(const ADirName:string);
Get:从FTP服务器上下载文件.这个方法被重载了.
原型为:
procedure Get(const ASourceFile:string;ADest:TStream);overload;
procedure Get(const ASourceFile:string;const ADest:string;ACanOverWrite:Boolean);overload;
Put:用于向服务器上传文件.该方法被重载.
原型为:
procedure Put(const ASourceFile:TStream;const ADest:string;const Appand:Boolean);overload;
procedure Put(const ASourceFile:string;const ADest:string;const AAppand:Boolean);overload;
KillDataChannal:关闭FTP数据通道.
所谓“重载”,就是当从多个“类”身上继承一些方法时,会发生冲突。为了避免这一个冲突,就使用了“重载”功能 
Delete:删除FTP服务器上一个文件.
原形为:procedure Delete(const AfileName:string);
Rename:更改服务器上的文件名.
原型为:
procedure Rename(const ASourceFile:string;const ADestFile:string);
Size:获取文件大小信息.
原型为:
function Size(const AFileName:string):Integer; 
当大家装好INDY9.0 附带一个例程,在INDY\FTPDEMO下可以找到. 
是一个不错的DEMO 
我仿造这个DEMO做的一个例子。里面包含详细的注释。
当然,还要讲一下,做FTP客户端的心得哦 
我现在,慢慢把里面的代码发了来做一下讲解 
首先是登录按钮里的代码: 
还是先给大家看一下这个界面吧 
Delete:删除FTP服务器上一个文件.
原形为:procedure Delete(const AfileName:string);
Rename:更改服务器上的文件名.
原型为:
procedure Rename(const ASourceFile:string;const ADestFile:string);
Size:获取文件大小信息.
原型为:

function Size(const AFileName:string):Integer;

连接按钮的代码:

 

 
  1. begin

  2. ftpcon.Enabled:=false;

  3. //-----------------连接FTP服务器------------------//

  4. with idftp do begin

  5. try

  6. Host:=trim(edit1.Text); //FTP服务器IP地址

  7. Username:=trim(edit2.Text); //用户名

  8. Password:=trim(edit3.Text); //密码

  9. Connect; // 连接

  10. DirectoryListBox.Items.Clear; // 清空目录以及文件信息

  11. DebugListBox.Items.Clear; // 清空记录信息

  12. // SaveFTPHostInfo(trim(CURDIR.Text), 'FTPHOST');

  13. finally

  14. if Connected then begin

  15. DisplayDir(trim(CURDIR.Text)); // 改变当前路径

  16. FTPCon.Enabled:=false; // 连接按钮

  17. FTPDisCon.Enabled:=True; // 断开按钮

  18. end;

  19. end;

  20. end;

  21. end;



断开按钮的代码: 

 
  1. begin

  2. try

  3. if IdFTP.Connected then // 判断客户端是否连着服务器

  4. IdFTP.Abort;

  5. if TransferrignData then // 判断客户端与服务器之间是否有数据传输

  6. IdFTP.Quit;

  7. finally

  8. IdFTP.Disconnect; // 断开连接

  9. FTPCon.Enabled:=true;

  10. FTPDisCon.Enabled:=false;

  11. end;

  12. end;



TransferrignData变量全局变量里有定义的 
连接按钮里的DisplayDir的过程如下: 

 
  1. procedure TFFTPClient.DisplayDir(DirName: String);

  2. Var LS: TStringList;

  3. begin

  4. LS := TStringList.Create;

  5. try

  6. IdFTP.ChangeDir(DirName);

  7. IdFTP.TransferType:=ftASCII; // 编译不通过时 USES IdFTPCommon

  8. CURDIR.Text:= IdFTP.RetrieveCurrentDir;

  9. DirectoryListBox.Items.Clear;

  10. IdFTP.List(LS); // 把IDFTP里的LIST与LS关联起来

  11. DirectoryListBox.Items.Assign(LS); // 把DIRECTORYLISTBOX 与 LS 关联起来

  12. if DirectoryListBox.Items.Count > 0 then

  13. if AnsiPos('total', DirectoryListBox.Items[0]) > 0 then

  14. DirectoryListBox.Items.Delete(0);

  15. finally

  16. LS.Free;

  17. end;

  18. end;



还有一个最重要的一段代码,就是listbox如何显示目录信息的 
首先,把LISTBOX的STYLE的属性改成lbOwnerDrawFixed 
再在ONDRAWITEM方法里添加如下代码: 

 
  1. procedure TFFTPClient.DirectoryListBoxDrawItem(Control: TWinControl; Index: Integer;

  2. Rect: TRect; State: TOwnerDrawState);

  3. Var R: TRect;

  4. begin

  5. //---------------------------------当选择一条记录时

  6. if odSelected in State then begin

  7. DirectoryListBox.Canvas.Brush.Color := $00895F0A;

  8. DirectoryListBox.Canvas.Font.Color := clWhite;

  9. end else begin

  10. DirectoryListBox.Canvas.Brush.Color := clWindow;

  11. end;

  12. //---------------------------------显示当前目录里的信息

  13. if Assigned(IdFTP.DirectoryListing) and (IdFTP.DirectoryListing.Count>Index) then begin

  14. DirectoryListBox.Canvas.FillRect(Rect);

  15. with IdFTP.DirectoryListing.Items[Index] do begin

  16. //------------------------//

  17. DirectoryListBox.Canvas.TextOut(Rect.Left, Rect.Top, FileName); // 文件名

  18. R := Rect;

  19. R.Left := Rect.Left + HeaderControl1.Sections.Items[0].Width;

  20. //------------------------//

  21. R.Right := R.Left + HeaderControl1.Sections.Items[1].Width;

  22. DirectoryListBox.Canvas.FillRect(R);

  23. DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, IntToStr(Size)); // 文件大小

  24. //------------------------//

  25. R.Left := R.Right;

  26. R.Right := R.Left + HeaderControl1.Sections.Items[2].Width;

  27. DirectoryListBox.Canvas.FillRect(R);

  28. // 是文件夹类型 编译不通过时要USES IDFTPLIST

  29. if ItemType = ditDirectory then begin

  30. DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, '文件夹');

  31. end else begin

  32. DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, '文件');

  33. end;

  34. //------------------------//

  35. R.Left := R.Right;

  36. R.Right := R.Left + HeaderControl1.Sections.Items[3].Width;

  37. DirectoryListBox.Canvas.FillRect(R);

  38. DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, FormatDateTime('yyyy-mm-dd hh:mm', ModifiedDate)); // 修改时间

  39. //------------------------//

  40. R.Left := R.Right;

  41. R.Right := R.Left + HeaderControl1.Sections.Items[4].Width;

  42. DirectoryListBox.Canvas.FillRect(R);

  43. DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, GroupName); // 组名

  44. //------------------------//

  45. R.Left := R.Right;

  46. R.Right := R.Left + HeaderControl1.Sections.Items[5].Width;

  47. DirectoryListBox.Canvas.FillRect(R);

  48. DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, OwnerName); // 拥有者名字

  49. //------------------------//

  50. R.Left := R.Right;

  51. R.Right := R.Left + HeaderControl1.Sections.Items[6].Width;

  52. DirectoryListBox.Canvas.FillRect(R);

  53. DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, OwnerPermissions + GroupPermissions + UserPermissions); // 权限

  54. end;

  55. end;

  56. end;



这几部分是这软件里的中心 
不过,可以通过IDFTP里的work,status,workbegin,workend来实现进度条 
还有上传代码: 

 
  1. if IdFTP.Connected then begin

  2. if OpenDialog1.Execute then

  3. try

  4. IdFTP.TransferType := ftBinary;

  5. IdFTP.Put(OpenDialog1.FileName, ExtractFileName(OpenDialog1.FileName));

  6. finally

  7. DisplayDir(idftp.RetrieveCurrentDir);

  8. end;

  9. end;



这段代码,首先要判断IDFTP是否还连着 
下传代码如下:

 
  1. procedure TFFTPClient.DirectoryListBoxDblClick(Sender: TObject);

  2. Var FName: String;

  3. begin

  4. if not IdFTP.Connected then // 判断FTP是否还连着服务器

  5. exit;

  6. FName := IdFTP.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName;

  7. // 假如双击是文件夹,就改变路径

  8. if IdFTP.DirectoryListing.Items[DirectoryListBox.ItemIndex].ItemType = ditDirectory then begin

  9. CURDIR.Text:=Trim(FName);

  10. DisplayDir(CURDIR.Text);

  11. end else begin

  12. try

  13. SaveDialog1.FileName := Name; // 得到保存的文件名

  14. if SaveDialog1.Execute then begin

  15. IdFTP.TransferType := ftBinary; // 以二进制进行传输

  16. BytesToTransfer := IdFTP.Size(Name); // 得到文件的大小

  17. if FileExists(Name) then begin

  18. case MessageDlg('文件已经存在,是否重新下载?',mtConfirmation, mbYesNoCancel, 0) of

  19. mrYes: begin

  20. BytesToTransfer := BytesToTransfer-FileSizeByName(Name); // FileSizeByName在IdGlobal

  21. IdFTP.Get(Name, SaveDialog1.FileName, false, true);

  22. end;

  23. mrNo: begin

  24. IdFTP.Get(Name, SaveDialog1.FileName, true);

  25. end;

  26. mrCancel: begin

  27. exit;

  28. end;

  29. end;

  30. end else begin

  31. IdFTP.Get(Name, SaveDialog1.FileName, false);

  32. end;

  33. end;

  34. finally

  35. end;

  36. end;

  37. end;



我要直接做在目录列表框的双击方法里的,假如双击文件就下载,文件夹就打开 
其它的功能,都是通过IDFTP的方法直接实现的。例如新建目录: 

 
  1. var DirName:string;

  2. begin

  3. DirName:=InputBox('输入新目录名称', '提示信息', '');

  4. if DirName <> '' then

  5. try

  6. IdFTP.MakeDir(DirName);

  7. DisplayDir(CURDIR.Text);

  8. finally

  9. end;

  10. end;



所以,对于FTP客户端的讲解也就如些了。 
是啊,把所有代码都压缩传到共享里 
noop只是客户端连到服务器,不被服务端T了 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值