我用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);

解决方案 »

  1.   

    FFileStream.Position := FStartAddr;
      //申请地址空间
      FileSeek(FFileStream.Handle, FEndAddr - FStartAddr, 1);那么现在FFileStream.Position = FStartAddr+(FEndAddr - FStartAddr);
    从而使得你的文件长度总是不对,大概是原文件的两倍
      

  2.   

    我总是从url的头信息中得到文件的大小.关注.
      

  3.   

    偶感觉好象你在CreateFile时申请了ContentLength长度的空间,然后又在下载的时候申请了空间,所以是两倍大小。