- 浏览: 242954 次
- 性别:
- 来自: ph
文章分类
最新评论
-
zrj_software:
说了等于没说,LZ能否把DLL代码给我研究下啊30729375 ...
如何在Delphi中调用.Net编写的DLL中的函数 -
reyesyang:
正在查找ruby单例模式相关资料,很有帮助,谢谢。
ruby中的单例模式 -
chaochao_pc:
您好,您的通讯工具能传输文件吗? 我在上边好像没找到!!! ...
Silverlight Socket 实现收发信息 -
huaxia524151:
谢谢,解决问题。return self.name.encode ...
Django笔记5(管理站点) -
yahon:
在flash中如何获取呢?
Flash+html--网页向FLASH传递参数
1 连接远程服务器
procedure Connect(AAutoLogin: boolean; const ATimeout: Integer);
2 改变目录
procedure ChangeDir(const ADirName: string);
3 下载
procedure Get(const ASourceFile: string; ADest: TStream; AResume: Boolean); overload;
procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean; AResume: Boolean); overload;
4 上传
procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: boolean); overload;
procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload;
5 删除
procedure Delete(const AFilename: string);
判断是否连接
if IdFTP1.Connected then
begin
...........
end;
引用别人一下,做为自己以后笔记
现在很多应用都需要上传与下载大型文件,通过HTTP方式上传大文件有一定的局限性。幸好FTP作为一个非常老而且非常成熟的协议可以高效稳定地完成大文件的上传下载,并且可以完美地实现续传。就拿我写的电影服务器管理端程序来说,各种方案比较后,发现使用FTP可以完美地实现要求。但是要通过WinSocket库实现FTP比较麻烦,幸好有Indy--一个包装了大多数网络协议的组件包。
通过Indy,程序设计人员可以通过阻塞方式进行编程,可以抛开蹩脚的Winsocket异步模式,采用与Unix系统上等同的阻塞编程模式进行。这样,程序员就可以很好的处理程序的运行流程。
下面,我们进入到Indy的TIdFtp世界。
1.控件的说明
使用Indy 9中的TIdFtp控件可以实现通过FTP方式进行文件的上传与下载。
2.控件的具体使用
(1)控件属性设置
默认属性即可,与服务器连接直接相关的属性如主机名与用户等在建立连接时进行设定。需要设定的是RecvBufferSize和SendBufferSize两属性的值。另外需要根据要传输的文件类型指定TransferType属性,而其他属性按默认值设定即可。
RecvBufferSize说明(默认值为8192字节):该属性为整型变量,用于指定连接所用的接受缓冲区大小。
SendBufferSize说明(默认值为32768字节):该属性也为整型变量,用于指定连接所用的发送缓冲区的最大值。该属性在WriteStream方法中时,可用于TStream指定要发送内容的块数。如果要发送的内容大于本属性值,则发送内容被分为多个块发送。
TransferType说明(默认值为ftBinary):该属性为TIdFTPTransferType型变量。用于指定传输内容是二进制文件(ftBinary )还是ASCII文件(ftASCII)。应用程序需要使用二进制方式传输可执行文件、压缩文件和多媒体文件等;而使用ASCII方式传输文本或超文本等文本型数据。
(2)控件的事件响应
OnDisconnected响应:TNotifyEvent类,用于响应断开(disconnect)事件。当Disconnect方法被调用用来关闭Socket的时候,触发该响应。应用程序必须指定该事件响应的过程,以便对该断开事件进行相应。
OnStatus响应:TIdStatusEvent类。该响应在当前连接的状态变化时被触发。该事件可由DoStatus方法触发并提供给事件控制器属性。axStatus是当前连接的TIdStatus值;aaArgs是一个可选的参数用于格式化函数,它将用于构造表现当前连接状态的文本消息。
OnWork响应:OnWord是TWorkEvent类事件的响应控制器。OnWork用于关联DoWork方法当缓冲区读写操作被调用时通知Indy组件和类。它一般被用于控制进度条和视窗元素的更新。AWorkMode表示当前操作的模式,其中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据。AWorkCount指示当前操作的字节计数。
OnWorkBegin响应:TWorkBeginEvent类。当缓冲区读写操作初始化时,该事件关联BeginWork方法用于通知Indy组件和类。它一般被用于控制进度条和视窗元素的更新。AWorkMode表示当前操作的模式,其中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据。AWorkCountMax用于指示发送到OnWorkBegin事件的操作的最大字节数,0值代表未知。
OnWorkEnd响应:TWorkEndEvent类。当缓冲区读写操作终止时,该事件关联EndWork方法用于通知Indy组件和类。AWorkMode表示当前操作的模式,其中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据。AWorkCount表示操作的字节数。
在事件响应中,主要通过上述五种事件响应来控制程序。在一般情况下,在OnDisconnected中设定连接断开的界面通知;在OnStatus中设定当前操作的状态;在OnWork中实现传输中状态条和其他参数的显示;而在OnWorkBegin和OnWorkEnd中分别设定开始传输和传输结束时的界面。
(3)连接远程服务器
完成了设定控件属性和实现了控件的事件响应后,就可以与服务器进行交互和传输了。在连接之前,应首先判断IdFtp是否处于连接状态,如果Connected为False,则通过界面控件或其他方式指定与服务器连接相关的一些TCP类属性的设置,分别是:Host(主机名):String、Username(用户名):String、Password(密码):String,也可以指定Port(端口)。之后调用Connect方法连接远程服务器,如果无异常出现则连接成功建立。
过程说明:procedure Connect(AAutoLogin: boolean; const ATimeout: Integer);
该过程连接远程FTP服务器
属性:AAutoLogin: boolean = True
连接后自动登录,该参数默认为True。
const ATimeout: Integer = IdTimeoutDefault
超时时间,单位:秒。
示例代码:
if IdFTP1.Connected then try
if TransferrignData then IdFTP1.Abort;
IdFTP1.Quit;
finally
end
else with IdFTP1 do try
Username := UserIDEdit.Text;
Password := PasswordEdit.Text;
Host := FtpServerEdit.Text;
Connect;
ChangeDir(CurrentDirEdit.Text);
finally
end;
(4)改变目录
连接建立后,可以改变当前FTP会话所在的目录。对于已知绝对路径的情况下,可以直接调用ChangeDir(const ADirName: string)方法来转换目录,ADirName表示服务器上的文件系统目录,另外还可以调用ChangeDirUp回到上级目录。
如果未知路径,则可以通过List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean)过程获取远程服务器的当前目录结构,此时必须设定TransferType为ftASCII(ASCII模式),其中:ADest保存当前目录结构,可以在后续程序中调用该列表。另外可以通过RetrieveCurrentDir方法获取当前目录名。
过程说明:
procedure ChangeDir(const ADirName: string);
改变工作目录
属性
const ADirName: string
远程服务器的目录描述
说明:该过程实际上是实现了FTP CWD命令。
procedure ChangeDirUp;
到上一级目录
function RetrieveCurrentDir: string;
该函数返回当前目录名
procedure List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean);
列出当前目录所有文件和子目录及其属性
参数:
ADest: TStrings
保存文件及子目录的返回结果
const ASpecifier: string =
文件掩码,用于列出符合条件的文件
const ADetails: boolean = true
包含文件和子目录属性
property DirectoryListing: TIdFTPListItems;
返回文件及目录结构的列表
示例代码:
LS := TStringList.Create;
try
IdFTP1.ChangeDir(DirName);
IdFTP1.TransferType := ftASCII;
CurrentDirEdit.Text := IdFTP1.RetrieveCurrentDir;
DirectoryListBox.Items.Clear;
IdFTP1.List(LS);
DirectoryListBox.Items.Assign(LS);
if DirectoryListBox.Items.Count > 0 then
if AnsiPos(total, DirectoryListBox.Items[0]) > 0 then DirectoryListBox.Items.Delete(0);
finally
LS.Free;
end;
(5)下载的实现
在下载之前,必须查看DirectoryListing.Items[sCurrFile].ItemType是否为文件,如返回为ditDirectory则代表当前文件名为目录,不能下载,必须导向到文件才可。如为文件,则可以进行下载。在下载前,设定传输的类型为二进制文件,并且指定本地要保存的路径。通过调用Get方法,实现文件的下载。下载过程较慢,可以考虑将其放到线程中实现。
过程说明:
procedure Get(const ASourceFile: string; ADest: TStream; AResume: Boolean); overload;
procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean; AResume: Boolean); overload;
从远程服务器上获取文件。
属性说明:
const ASourceFile: string
远程服务器上的源文件名
const ADestFile: string
保存到客户机上的文件名
const ACanOverwrite: boolean = false
重写同名文件
AResume: Boolean = false
是否进行断点续传
示例代码:
SaveDialog1.FileName := Name;
if SaveDialog1.Execute then begin
SetFunctionButtons(false);
IdFTP1.TransferType := ftBinary;
BytesToTransfer := IdFTP1.Size(Name);
if FileExists(Name) then begin
case MessageDlg(File aready exists. Do you want to resume the download operation?,
mtConfirmation, mbYesNoCancel, 0) of
mrYes: begin
BytesToTransfer := BytesToTransfer - FileSizeByName(Name);
IdFTP1.Get(Name, SaveDialog1.FileName, false, true);
end;
mrNo: begin
IdFTP1.Get(Name, SaveDialog1.FileName, true);
end;
mrCancel: begin
exit;
end;
end;
end
else begin
IdFTP1.Get(Name, SaveDialog1.FileName, false);
end;
(6)上传的实现
上传的实现与下载类似,通过put方法即可。
过程说明:
procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: boolean); overload;
procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload;
上传文件至服务器
属性说明:
const ASourceFile: string
将要被上传的文件
const ADestFile: string =
服务器上的目标文件名
const AAppend: boolean = false
是否继续上传
代码示例:
if IdFTP1.Connected then begin
if UploadOpenDialog1.Execute then try
IdFTP1.TransferType := ftBinary;
IdFTP1.Put(UploadOpenDialog1.FileName, ExtractFileName(UploadOpenDialog1.FileName));
//可以在此添加改变目录的代码;
finally
//完成清除工作
end;
end;
(7)删除的实现
删除文件使用Delete方法,该方法删除指定的文件,删除对象必须为文件。如果要删除目录则使用RemoveDir方法。
过程说明:
procedure Delete(const AFilename: string);
删除文件
procedure RemoveDir(const ADirName: string);
删除文件夹,根据不同的服务器删除文件夹有不同的要求。有些服务器不允许删除非空文件夹,程序员需要添加清空目录的代码。
上述两个过程的参数均为目标名称
代码示例:
if not IdFTP1.Connected then exit;
Name := IdFTP1.DirectoryListing.Items[iCurrSelect].FileName;
if IdFTP1.DirectoryListing.Items[iCurrSelect].ItemType = ditDirectory then try
idftp1.RemoveDir(Name);
finally
end
else
try
idftp1.Delete(Name);
finally
end;
(8)后退的实现
后退在实际上是目录操作的一种,可以简单的改变当前目录为..来实现,也可以通过回到上级目录来实现。
(9)取消的实现
在IdFtp的传输过程中,可以随时使用abort方法取消当前操作。可以的OnWork事件的实现中来确定何时取消操作。
代码示例:
//取消按钮的OnClick响应
procedure TMainForm.AbortButtonClick(Sender: TObject);
begin
AbortTransfer := true;
end;
//IdFTP的OnWork事件响应
procedure TMainForm.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
...
if AbortTransfer then IdFTP1.Abort;
AbortTransfer := false;
end;
(10)断点续传的实现
断点续传就是在上传或下载过程开始时,判断已经传输过的文件是否上传输完毕,如果传输没有成功完成,则在上次中断处继续进行传输工作。实现该功能需要两个重要的操作,首先是判断文件的大小信息,其次是在传输过程Get和Put中指定上传的行为。
判断服务器上文件的大小使用函数Size(FileName)。在下载过程中,比较本地文件和远程文件的信息,然后在Get中指定AResume := True即可。而上传也一样,指定Put的AAppend := True就可以了。
在前面我们讲过,Indy的网络操作大部分是阻塞模式的,TIdFtp也不例外。这样在上述各个操作运行过程的时候用户界面被暂时冻结,必须要等待调用返回才能继续用户操作界面响应。所以在实际编程中,需要使用多线程的方式来保证户界面的响应。Windows系统可以使用CreateThread系统调用来创建线程,但是在使用的时候需要开发人员做很多额外的工作来保证线程的同步等问题。而Indy中也包含了实现多线程的控件TIdThreadComponent,相对比之下该控件实现多线程时更加方便,也更容易控制。我将在后续的文章里为大家介绍TIdThreadCOmponent的使用方法。
发表评论
-
用Delphi实现文件下载的几种方法
2010-10-08 10:23 1295笔者最近开发的系统中需要写一个下载文件的功能。以前用BCB调用 ... -
Delphi absolute关键字
2010-09-20 11:51 1161//它使得你能够创建一个新变量, 并且该变量的起始地址与另一个 ... -
如何在Delphi中调用.Net编写的DLL中的函数
2010-09-16 09:30 2224最近因公司群发邮件程式需要给注册一段时间没有激活的用户 ... -
WinAPI: SetLayeredWindowAttributes - 设置窗口的透明
2010-09-15 15:22 2010//声明:SetLayeredWindowAttributes ... -
Delphi 2010 中的泛型
2010-09-15 09:42 13192010已发布很长时间了,口碑还不错,准备用它开发下一项目,但 ... -
Delphi2010组件/控件安装方法
2010-09-14 09:36 1470delphi 有很多组件可以用,下面介绍一下 在delphi2 ... -
delphi利用SHBrowseForFolder选择目录
2010-08-02 09:41 2102要求:利用Win32 API SHBrowseForFolde ... -
Microsoft Agent技术简介
2009-11-12 11:33 1251Agent技术的应用 ---- Micr ... -
delphi对象序列化
2009-10-31 10:12 1223function ComponentToStr(ACompon ... -
Delphi屏蔽控件的默认右键菜单
2009-10-28 14:34 1848在很多情况下我们也许 ... -
Delphi编程实现程序快捷方式
2009-10-24 10:46 1357摘要:本文主要介绍了 ... -
基于Delphi的融合DLL中的窗体
2009-09-24 14:29 7325基于Delphi的融合DLL中的 ... -
delphi中的静态变量
2009-09-24 10:51 1501众所周知,java,vb,c和c++中都有静态变量,它们都在变 ... -
取得系统运行的进程名
2009-07-31 14:13 856var hCurrentWindow:HWnd;szText: ... -
获得消逝时间
2009-07-31 14:11 999在测试硬件或软件的效率时或跟踪用户的响应速度时,需要测定消逝的 ... -
使用Delphi获取系统信息
2009-07-31 14:05 993Delphi以其优良的可视化编程,灵活的Windows ... -
相对路径转化为绝对路径
2009-07-31 14:02 1329请先添加 ComObj, ComConst引用,以下是实现代码 ...
相关推荐
对于事件响应,TIdFTP 提供了几个关键的事件处理: - `OnDisconnected` 在断开连接时触发,可以在这里处理断开连接的逻辑。 - `OnStatus` 在连接状态变化时触发,用于获取和显示连接状态信息。 - `OnWork` 在数据...
这个函数接受两个参数:`AAutoLogin`用于指示是否自动登录,`ATimeout`则用于设置连接超时时间。一旦连接成功,你可以通过检查`IdFTP1.Connected`属性来确认连接状态。 2. 改变目录: `ChangeDir`函数允许你在远程...
idftp demo
本示例主要关注的是使用Delphi XE7构建一个IDFTP客户端的演示源码,这允许开发者实现文件传输协议(FTP)的功能。IDFTP是Indy库的一部分,Indy是一个用于网络通信的开源组件集合,它为各种网络协议提供了全面的支持...
代码很简单,代码很简单。 建议到家先行百度 下面是d7的 idFTP1.IOHandler.DefStringEncoding:=tencoding.UTF8;
idftp控件用法2011-04-25 22:22FTP是一个标准协议,它是在计算机和网络之间交换文件的最简单的方法。
在Delphi编程环境中,IDFTP组件是用于执行FTP(File Transfer Protocol)操作的强大工具,它提供了丰富的功能,包括上传、下载、重命名以及删除FTP服务器上的文件和目录。本篇文章将详细阐述如何利用IDFTP组件在...
标题中的“idftp 对比更新”指的是一个使用Delphi XE2开发的IDFTP组件进行文件上传和更新的程序。这个程序可能具有多线程功能,使得文件传输更高效,尤其是在处理大量文件时。"对比更新"意味着它能比较本地和远程...
首先,IDFTP 是 Indy 库中的一个关键组件,它实现了 FTP 协议的客户端部分,允许 Delphi 开发者方便地进行文件上传、下载、目录管理等操作。FTP 是一种基于 TCP/IP 的标准协议,常用于在互联网上进行文件的交换。...
FTP (File Transfer Protocol) 是一...总之,Delphi 的 IdFTP 组件提供了一个简单易用的接口,用于实现 FTP 文件上传功能。通过理解这些基本概念和方法,你可以轻松地在 Delphi 应用程序中构建自己的 FTP 客户端功能。
`Main.h`头文件则包含相关类和函数的定义。`(21)uniGUI for C++ builder下如何使用IdFTP发送文件.docx`文档详细阐述了整个过程,包括可能遇到的问题和解决方案,建议仔细阅读以加深理解。 通过以上步骤,你可以在...
delphi idftp服务器和客户端例程,已在delphi xe10.4上调试并汉化。2022.08.14
采用Delphi2007原生idFTP开发,基本原理是:客户端从FTP获取到文件版本信息列表,并与本地文件版本比较,然后确定需要升级内容,再逐个从FTP服务器上下载到本地临文件夹中,待全部下载完成后覆盖到程序目录;...
第一次在CSDN上传东东哈。为自己挣点分数先。 idFTP用的是PASV模式,试了很久,用PORT模式工作不稳定。 另:上传时忘了放进Demo,到这里下 http://download.csdn.net/source/1495251
采用Delphi2007原生idFTP开发,基本原理是:客户端从FTP获取到文件版本信息列表,并与本地文件版本比较,然后确定需要升级内容,再逐个从FTP服务器上下载到本地临文件夹中,待全部下载完成后覆盖到程序目录;...
在Delphi中,我们通常使用`IdFTP`组件来完成这一任务。以下是一个典型的连接过程: ```delphi procedure TForm1.ConnectButtonClick(Sender: TObject); begin if not IdFTP1.Connected then // 如果尚未连接 ...
想必大家利用delph操作过ftp,最熟悉的就是利用idftp控件 但是delphi进入xe2版本 该控件是可以用 但是中文乱码问题没办法解决 这里也请教大家 有没什么...所以,本人就利用系统api做了个调用ftp的类,仅供大家参考。。
以下是一个简单的实现示例: 1. 创建一个`TProgressBar`控件,并设置其最大值为要上传的文件大小。 2. 在`TIdFTP`组件的`OnWork`事件中,更新进度条的当前位置。这个事件会在每次数据传输时被触发,参数`WorkMode`...
这个名为“一个类似于腾信QQ的升级程序的代码”的项目,显然旨在模仿腾讯QQ的更新机制,使用了IdFtp控件来实现文件的远程下载和更新功能。下面我们将深入探讨这个升级程序的相关知识点。 1. **FTP(File Transfer ...
在Delphi编程环境中,开发一个FTP(File Transfer Protocol)客户端是一项常见的任务,特别是在构建网络应用程序时,需要上传或下载文件到远程服务器。本教程将详细讲解如何利用Indy组件库在Delphi中创建一个功能...