高分求助!多线程下载文件,分割合并后文件大小改变(100分)

  • 主题发起人 主题发起人 firebirdrui
  • 开始时间 开始时间
F

firebirdrui

Unregistered / Unconfirmed
GUEST, unregistred user!
网上关于http多线程下载都提出把文件平均分配给每个线程,可惜我照做之后,合并起来的文件总是跟原文件大小不一样.哪位高手指点一下,高分回报.小弟新手.对delphi一点不懂.
//循环产生线程
procedure TForm1.GetThread();
var
i ,start,last : integer;
fileName : String;
begin
i:=1;
while i<=nndo
//nn为设定好的线程数.
begin
if i=nn then
begin
start := avg*(i-1);
last := aFileSize;//aFileSize为服务器上文件的大小
end
else
start := avg*(i-1);
last := avg*i;
fileName:=aFile+IntToStr(i);//fileName为该线程下载的那一部分临时文件名
MyThread:=TThread1.create1(aURL,fileName, false ,start,last);
i :=i+1;
end;
end;
//下载文件函数
procedure TThread1.DownLodeFile();
var
temhttp: TIdHTTP;
begin
temhttp := TIdHTTP.Create(nil);
Form1.IdAntiFreeze1.OnlyWhenIdle:=False;//设置使程序有反应.
if FileExists(temFileName) then
//如果文件已经存在
tStream := TFileStream.Create(temFileName, fmOpenWrite) else
tStream := TFileStream.Create(temFileName, fmCreate);
temhttp.Request.ContentRangeStart := tstart;
temhttp.Request.ContentRangeEnd := tlast;
try
temhttp.Get(tURL, tStream);
//开始下载
Form1.ListBox1.ItemIndex := Form1.ListBox1.Items.Add(temFileName+'download');
finally
tStream.Free;
end;
end;
而合并只是反复用了这两句话.
mStream1.seek(mStream1.size,soFrombegin
ning);
mStream1.copyfrom(mStream2,mStream2.size);
哪位大哥对文件比较精通指点下小弟...
 
不会吧,,100分啊,,这都是小弟全部家产的一半拉.难道你们想让我掏出最后一个铜板才肯告诉我吗.
 
下载可以用多线程。合并时由于要进行流的定位。不能同时进行。要排队
 
分割问题已经有位哥哥给解决了,
修改为last:=avg*i-1;
当i等于线程数时last:=avg*i+aFileSize-avg*nn
//nn为线程数,aFileSize为服务器文件大小;
 
to网中戏:
哥哥可以说的明白一点吗。你说的我都不懂呢,刚刚学几天。我这是下载了很多临时文件的,然后在一个一个的合并,我也知道自己做的不好,因为网上那写软件,只有一个临时文件的。有位哥哥告诉我可以新建文件的时候就设置文件的size,我感觉挺不可思议的,偶对文件真的不太懂拉。
谁能说个好方法,对于文件合并。
 
帮顶!
http://www.source520.com
站长开发推广同盟 站长朋友的终极驿站
同时拥有海量源码电子经典书籍下载
http://www.source520.com/search/search.asp
&quot;编程.站长&quot;论坛搜索引擎-----为中国站长注入动力!
 

Similar threads

I
回复
0
查看
686
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
528
import
I
后退
顶部