Delphi实现Ftp客户端下载(支持断点续传,多线程传输)

简介:

以前写的一个ftp客户端下载的玩意!支持了断点续传,多线程传输等(实际上并非是一个真正多线程的传输与下载模式,是一个伪多线程方式,仅仅是多开ftp端口,连接上之后从指定的数据段位置开始下载,所以要想真正意义上实现一个多线程的模式还是需要在服务器端做相应的处理才能实现!)代码写的很简陋,仅仅提供了一个DownLoad方法,传递一个Ftp格式的URL然后解析出实际地址与文件名等开始实现下载!大致代码:

复制代码
 
 
{ ******************************************************* }
{ }
{ 得闲工作室 Ftp客户端下载控件单元 }
{ FtpClient }
{ 作者: 不得闲 2009年2月25日, 9:09:04 }
{ }
{ ******************************************************* }

unit FtpClient;

interface
uses Windows,Classes,SysUtils,StrUtils,ScktComp,WinInet, Messages,Forms,IniFiles;

type
TDxFtpClient
= class ;

TDxSockState
= (Ds_DataOk,Ds_UserTerminate,Ds_DataErr);

TReadWriteThread
= class (TThread)
private
FDataSocket: TClientSocket;
Owner: TDxFtpClient;
SocketDataStream: TWinSocketStream;
procedure DownLoad;
procedure UpLoad;
protected
procedure Execute; override ;
procedure UpdateProgress;
public
constructor Create(bSuspend:Boolean;AOwnerFtp: TDxFtpClient;Host: string ;Port: Word);
destructor Destroy; override ;
end ;

TDxFtp
= class ;


{ FTP的双线连接,数据连接与命令连接 }
TDxFtpClient
= class (TComponent)
private
FCmdSocket: TClientSocket;
// 数据连接与命令连接
DataStream: TMemoryStream;
protected
DataSize,ReadySize: Int64;
OwnerFtp: TDxFtp;
SocketIndex: Integer;
ReadWriteThread: TReadWriteThread;
User,PassWord,DirName,FileName,Host:
string ;
ConPort: Word;
procedure DoCmdSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure DoCmdSocketError(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure DoReadWriteEnd(Sender: TObject);
public
constructor Create(AOwner: TComponent); override ;
destructor Destroy; override ;
procedure Open;
end ;


// 下载开始事件,Conindex指定下载的线程号,startPos和TotalSize分别指定下载开始位置和总数据量
TOnDownStartEvent
= procedure (sender:TObject;conindex: integer;startPos,totalSize:Int64) of object ;
// 进度事件,分别指定为当前进度,以及下载速度
TOnProgressEvent
= procedure (Sender: TObject;Const FileReadySize,FileTotalSize: int64; const Progress: Single; const ReadWriteRate: Single) of object ;
// 上传下载完成时候触发的事件,ReadyState指定完成的状态
TOnUpDownReadyEvent
= procedure (Sender: TObject; const FileReadySize,FileTotalSize: Int64; const ReadyState: TDxSockState) of object ;
// 在下载和上传时,SockStream在读取和写入数据失败的时候触发的事件!WaitAgain表示是否继续等待下一次读取和写入,默认是不等待,
// 如果不等待,则直接中止数据传输,否则一直等待直到有数据读取和写入
// 如果不指定该事件,自动检测10次,如果超过10没有读取或写入数据,代表异常,传输数据中止

TSocketError
= procedure (Sender: TObject;ErrorEvent: TErrorEvent; var ErrorCode: Integer) of object ;

TReadWritDataErrEvent
= procedure (Sender: TObject; var WaitAgain: Boolean { 继续等待 } ) of object ;
TDxFtp
= class (TComponent)
private
FThreadCount: Integer;
FtpSocketArr:
array of TDxFtpClient;
Ini: TMemIniFile;
FileTotalSize: Int64;
FOnDownStart: TOnDownStartEvent;
FOnProgress: TOnProgressEvent;
ReadyCount: Integer;
// 执行完成的数量
DownStartTick: DWORD;
BeginSize: Int64;
SaveFileName:
string ;
UserTerminated: Boolean;
// 用户终止
CriticalSection: TRTLCriticalSection;
// 创建一个临界区
FileStream: TFileStream;
SaveFileIntime: Boolean;
// 实时保存数据文件
IsUpLoad: Boolean;
FOnUpDownReady: TOnUpDownReadyEvent;
SockState: TDxSockState;
FOnReadWriteDataError: TReadWritDataErrEvent;
FOnSocketError: TSocketError;
procedure SetThreadCount( const Value: Integer);
function GetActive: Boolean;
procedure DownReady; // 全部完成,文件合并
procedure Ready;
public
constructor Create(AOwner: TComponent); override ;
destructor Destroy; override ;
property ThreadCount: Integer read FThreadCount write SetThreadCount default 2 ; // 线程数量
procedure Suspend; // 暂停
procedure Resume; // 继续
procedure Terminate; // 终止数据传输
property Active: Boolean read GetActive; // 是否活动
procedure DownLoad( const FptUrl: string ;SaveToFile: string ; const SaveInTime: Boolean = False); // 下载
procedure UpLoad( const FileName,FtpUrl: string );
procedure SaveCfg(CfgFile: string ); // 生成配置文件
property OnDownStart: TOnDownStartEvent read FOnDownStart write FOnDownStart;
property OnProgress: TOnProgressEvent read FOnProgress write FOnProgress;
property OnUpDownReady: TOnUpDownReadyEvent read FOnUpDownReady write FOnUpDownReady;
property OnReadWriteDataError: TReadWritDataErrEvent read FOnReadWriteDataError write FOnReadWriteDataError;
property OnSocketError: TSocketError read FOnSocketError write FOnSocketError;
end ;

function CheckFileName( const FileName: string ): string ;
function RightPos(Const SubStr,Str: string ; const index: integer =- 1 ): integer;
implementation
const
RecvTmpBufSize
= 64 * 1024 ;
end .
复制代码

2010020822055648.jpg

本文转自 不得闲 博客园博客,原文链接:   ,如需转载请自行联系原作者http://www.cnblogs.com/DxSoft/archive/2010/02/08/1666100.html   ,如需转载请自行联系原作者

相关文章
|
28天前
|
存储 Shell Linux
【Shell 命令集合 文件传输 FTP客户端工具】Linux ncftp 命令使用指南
【Shell 命令集合 文件传输 FTP客户端工具】Linux ncftp 命令使用指南
35 0
|
5月前
|
Unix Shell Linux
客户端如何查找FTP服务器的用户名和密码
客户端如何查找FTP服务器的用户名和密码
|
7月前
|
安全 数据安全/隐私保护
直播系统源码部署,高效文件管理与传输的FTP协议
在直播系统源码部署后的每天要处理大量媒体文件的情况下,FTP协议可以依靠自身的强大文件传输管理机制、备份与恢复与自动化任务来帮助平台用户更好的操作体验,通过FTP协议,也确保直播系统源码媒体文件传输的可靠性与安全性,让直播系统源码成为了更优质的平台。
直播系统源码部署,高效文件管理与传输的FTP协议
|
9月前
|
网络协议 C# 文件存储
C# 利用FluentFTP实现FTP上传下载功能
C# 利用FluentFTP实现FTP上传下载功能
184 0
C# 利用FluentFTP实现FTP上传下载功能
|
1月前
|
Shell Python Windows
通过Python实现win11环境下FTP的上传与下载
通过Python实现win11环境下FTP的上传与下载
|
2月前
|
Java
java上传、下载、预览、删除ftp服务器上的文件
java上传、下载、预览、删除ftp服务器上的文件
|
2月前
|
Ubuntu Linux 网络安全
MobaXterm的是有用方法---集串口,SSH远程登录和FTP传输三合一工具
MobaXterm的是有用方法---集串口,SSH远程登录和FTP传输三合一工具
56 3
|
7月前
|
Apache
基于commons-net实现ftp创建文件夹、上传、下载功能.
基于commons-net实现ftp创建文件夹、上传、下载功能.
106 0
|
8月前
|
Java
Java——通过Java代码从ftp服务器下载文件
Java——通过Java代码从ftp服务器下载文件
|
4月前
|
API 分布式数据库 数据安全/隐私保护
C/C++ 实现FTP文件上传下载
FTP(文件传输协议)是一种用于在网络上传输文件的标准协议。它属于因特网标准化的协议族之一,为文件的上传、下载和文件管理提供了一种标准化的方法,在Windows系统中操作FTP上传下载可以使用WinINet库,WinINet(Windows Internet)库是 Windows 操作系统中的一个网络 API 库,用于访问 Internet 上的资源。它提供了一组函数,使开发人员能够创建网络应用程序,例如通过 HTTP 协议下载文件,发送 HTTP 请求,处理 cookie 等,本章将通过使用WinInet所提供的接口实现FTP文件上传下载功能,使得用户可以通过代码的方式上传或下载文件与FTP
73 1
C/C++ 实现FTP文件上传下载

热门文章

最新文章