用delphi实现ftp多线程下载源代码(转)

//接收文件

function TForm1.GetURLFileName(aURL: string):
string;

var

i: integer;

s: string;

begin //返回下载地址的文件名

s := aURL;

i := Pos(‘/‘, s);

while i <> 0 do //去掉"/"前面的内容剩下的就是文件名了

begin

Delete(s, 1, i);

i := Pos(‘/‘, s);

end;

Result := s;

end;

//得到文件大小

function TForm1.GetFileSize(aURL: string):
integer;

var

FileSize : integer;

tStream: TFileStream;

FileName: String;

begin

//tStream.size := 0;

IdFTP1.StructureMount(aURL);********************************不知道用的对不对?

//FileSize := IdFTP1.Response.ContentLength;

FileSize := IdFTP1.size(FileName);

//FileSize := IdFTP1.ContentLength(FileName);

IdFTP1.Abort;

Result := FileSize;

end;

//多线程下载

procedure TForm1.Button11Click(Sender: TObject);

var

m:integer;

begin

Showmessage(‘OK!主线程在执行,获得文件名并显示在Edit5中‘);

aURL := Edit4.Text; //ftp方式下载地址

aFile := GetURLFileName(Edit4.Text);//得到文件名

xx:= StrToInt(Edit5.Text); //输入的线程数

m:=1;

aFileSize := GetFileSize(aURL);

avg := trunc(aFileSize/xx);

try

GetThread();

while m<=xx do

begin

MyThread[m].Resume; //唤醒线程

m :=m+1;

end;

except

Showmessage(‘创建线程失败!‘);

Exit;

end;

end;

//开始下载前,将ProgressBar1的最大值设置为需要接收的数据大小.*******************

procedure TForm1.IdFTP1WorkBegin(Sender:
TObject; AWorkMode: TWorkMode;

const AWorkCountMax: Integer);

begin

AbortTransfer := False;

ProgressBar1.Max:=AWorkCountMax;

ProgressBar1.Min:=0;

ProgressBar1.Position:=0;

end;

//状态显示

procedure TForm1.IdFTP1Status(ASender: TObject;
const AStatus: TIdStatus;

const AStatusText: String);

begin

ListBox1.ItemIndex :=
ListBox1.Items.Add(AStatusText);

end;

// 多线程的产生

procedure TForm1.GetThread();

var

i ,start,last : integer;

FileName : String;

begin

i:=1;

while i<=xx do

begin

if i=1 then

begin

start := 0;

last := avg*i;

end

else

start := avg*(i-1);

last := avg*i;

FileName:=aFile+IntToStr(i);

MyThread[i]:=TThread1.create(aURL,
aFile,FileName, false , i,start,last);

i :=i+1;

end;

end;

//构造函数

constructor TThread1.create(aURL,
aFile,FileName: String; bResume: Boolean ;Count,start,last:integer);

begin

inherited create(true);

FreeOnTerminate := true;

tURL := aURL;

tFile := aFile;

tCount := Count;

tResume := bResume;

tstart :=start;

tlast :=last;

temFileName:= FileName;

end;

//下载文件函数

procedure TThread1.DownLodeFile();

var

//ftp: TIdFTP;

TIdFTP1 : TIdFTP;

tStream: TFileStream;

begin

TIdFTP1 := TIdFTP.Create(nil);

Form1.IdAntiFreeze1.OnlyWhenIdle:=False;//设置使程序有反应

if FileExists(temFileName) then //如果文件已经存在

tStream := TFileStream.Create(temFileName,
fmOpenWrite) else

tStream := TFileStream.Create(temFileName,
fmCreate);

if tResume then //续传方式

begin

exit;

end else //覆盖或新建方式

begin

TIdFTP1.MaxLineLength := tstart;(不对)********************文件下载的开始位置用TIdFTP什么属性来设置?

TIdFTP1.MinLineLength := tlast;(不对)*********************文件下载的结束位置用TIdFTP什么属性来设置?

end;

try

//TIdFTP1.Get(temFileName,tStream,true); //开始下载

TIdFTP1.Get(tURL,tStream); //开始下载

Form1.ListBox1.ItemIndex :=
Form1.ListBox1.Items.Add(temFileName+‘download‘);

finally

tStream.Free;

end;

end;

procedure TThread1.Execute;

begin

if Form1.Edit4.Text<>‘‘ then

synchronize(DownLodeFile)

else

exit;

end;

原文地址:https://www.cnblogs.com/sensoft/p/8462492.html

时间: 2024-11-08 22:48:36

用delphi实现ftp多线程下载源代码(转)的相关文章

Delphi ICS 多线程下载

一.FMultiPartHTTP 的事件: 下载完成事件 HTTPRequestDone(Sender: TObject; ErrorCode: Integer; const Reason: string); 在这里释放下载的文件流 FMultiPartHTTP.FileStream.Free; FMultiPartHTTP.FileStream := nil; 二.下载显示状态信息事件 HTTPShowStats(Sender: TObject); 在这里显示当前下载状态 str :=  '已

[Mac] mac linux 多线程下载利器 axel

?> 之前做过一些文件下载的统计,发现谷歌浏览器chrome和火狐firefox, 一般都是单线程的下载文件,360浏览器却是多线程的下载. 如今切换到了mac上,发现没有360哪个浏览器,就像找个在linux或者mac下能够多线程下载的工具. linux mac 下载现状 linux一般都是用的命令行下载wget curl尽管支持断点续传等.可是没有多线程下载.非常多时候还是太慢. mac下还经常使用浏览器下载,chrome自带的下载也非常慢.须要一些多线程下载的拓展. 搜索到的资源 http

Linux多线程下载工具Axel

Axel是 Linux 下一款不错的 HTTP 或 FTP 高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件,适合网速不给力时多线程下载以提高下载速度.需要注意的是,该软件只有命令行界面. 安装 sudo apt-get install axel 使用 axel [OPTIONS] url1 [url2] [url…] -n x  指定线程数(x 必须为大于 0 的数字) -o x  指定另存为目录(x 必须为本地目录) -s x  指定下载速度(

安卓 多线程下载文件

HTTP文件多线程下载 测试代码 String downloadUrl = "http://192.168.31.162/FileServer/SoftApk/UC-11.5.5.943.apk"; String filepath = PathUtils.getCachePath() + "UC-11.5.5.943.apk"; /** * 多线程下载 * 基于:http://blog.csdn.net/mad1989/article/details/3842146

【原创】linux命令-Axel命令 - linux多线程下载 - 费元星 - 未来星开发团队

[费元星版权Q:9715234] Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续[费元星版权Q:9715234]传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件.适合网速不给力时多线程下载提高下载速度.在百度服务器上用20个线程跑,速度是, ,已经达到宽带的房顶!比wget快的超级多! 大家感觉一下 CentOS安装Axel: 目前yum源上没有Axel,我[费元星版权Q:9715234]们可以到http://pkgs.repoforge.

赵雅智_java多线程下载

简介 线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配.不难理解,如果你线程多的话,那下载的越快.现流行的下载软件都支持多线程. 注意:实现多线程的条件是服务器支持单一IP多线程下载,如果不支持的话,很有可能封IP或者是只有一个线程能连接成功,多余线程被屏蔽.部分软件提供"用代理下载"方式,这种方式不会封IP. 原理 通常服务器同时与多个

赵雅智_android多线程下载带进度条

progressBar说明 在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度.一个进度条也可不确定其进度.在不确定模式下,进度条显示循环动画.这种模式常用于应用程序使用任务的长度是未知的. XML重要属性 android:progressBarStyle:默认进度条样式 android:progressBarStyleHorizontal:水平样式 progressBar重要方法 getMax():返回这个进度条的范围的

Linux下多线程下载工具 - Axel

Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件.适合网速不给力时多线程下载提高下载速度.比如在国内VPS或服务器上下载lnmp一键安装包用Axel就比wget快. CentOS安装Axel: 目前yum源上没有Axel,我们可以到http://pkgs.repoforge.org/axel/下载rpm包安装. 32位CentOS执行下面命令: wget -c http://pkgs.repof

CentOS6.4 安装aria2多线程下载工具

aria2是一个Linux下的多线程下载工具,支持HTTP/HTTPS.FTP.BitTorrent.Metalink协议. 平时在linux上下载http上的东西常用如wget.curl命令,但是他们都是单线程下载的.这里系统是CentOS6.3 64bit. aria2官方项目页面:http://aria2.sourceforge.net/ 安装aria2: wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.