我用TIDHTTP下载的文件长度总是不对,大概是原文件的两倍真实郁闷,代码如下(是写在线程中的,不知有没有关系):
if not FileExists(FFileName) then
begin
fHandle := CreateFile(PChar(FFileName), GENERIC_WRITE, FILE_SHARE_WRITE, nil,
CREATE_NEW, 0, 0);
try
FIdHttp.Head(FURL);
FileLength := FIdHttp.Response.ContentLength;
FileSeek(fHandle, FileLength, 0);
finally
FileClose(fHandle);
end;
end;
FFileStream := TFileStream.Create(FFileName, fmOpenWrite or fmShareDenyNone);
//计算块大小和下载的起始地址
BlockSize := (FileLength - FileLength mod ThreadNum) div ThreadNum;
FStartAddr := FThreadNo * BlockSize;
if FThreadNo < ThreadNum - 1 then
FEndAddr := (FThreadNo + 1) * BlockSize
else
FEndAddr := FileLength;
//设定下载请求资源的范围
FIdHttp.Request.ContentRangeStart := FStartAddr;
FIdHttp.Request.ContentRangeEnd := FEndAddr;
//设定文件的写入地址
FFileStream.Position := FStartAddr;
//申请地址空间
FileSeek(FFileStream.Handle, FEndAddr - FStartAddr, 1);
//启动计时器
FElapsedSecs := 0;
//下载分块数据
FIdHttp.Get(FURL, FFileStream);
LeaveCriticalSection(FLock);
if not FileExists(FFileName) then
begin
fHandle := CreateFile(PChar(FFileName), GENERIC_WRITE, FILE_SHARE_WRITE, nil,
CREATE_NEW, 0, 0);
try
FIdHttp.Head(FURL);
FileLength := FIdHttp.Response.ContentLength;
FileSeek(fHandle, FileLength, 0);
finally
FileClose(fHandle);
end;
end;
FFileStream := TFileStream.Create(FFileName, fmOpenWrite or fmShareDenyNone);
//计算块大小和下载的起始地址
BlockSize := (FileLength - FileLength mod ThreadNum) div ThreadNum;
FStartAddr := FThreadNo * BlockSize;
if FThreadNo < ThreadNum - 1 then
FEndAddr := (FThreadNo + 1) * BlockSize
else
FEndAddr := FileLength;
//设定下载请求资源的范围
FIdHttp.Request.ContentRangeStart := FStartAddr;
FIdHttp.Request.ContentRangeEnd := FEndAddr;
//设定文件的写入地址
FFileStream.Position := FStartAddr;
//申请地址空间
FileSeek(FFileStream.Handle, FEndAddr - FStartAddr, 1);
//启动计时器
FElapsedSecs := 0;
//下载分块数据
FIdHttp.Get(FURL, FFileStream);
LeaveCriticalSection(FLock);
//申请地址空间
FileSeek(FFileStream.Handle, FEndAddr - FStartAddr, 1);那么现在FFileStream.Position = FStartAddr+(FEndAddr - FStartAddr);
从而使得你的文件长度总是不对,大概是原文件的两倍