断点续传和自动更新的技术如何实现?(50分)

  • 主题发起人 主题发起人 uranium235
  • 开始时间 开始时间
U

uranium235

Unregistered / Unconfirmed
GUEST, unregistred user!
最好贴出例程来,大家共享,谢谢!
不过也可发至我的邮箱
uranium_235@etang.com
如果用到第三方控件,请留下下载地址,不必作为附件。
 
这个是我最近写的工程中的一段,GetHTMLFile是下载函数,载自日本朋友。

//--------------------------------------------------------------------------------
// 司马华鹏
function TfrmUpdate.GetHTMLFile( URL , FileName : string) : HRESULT;
var
status : IBindStatusCallback ;
begin
status := IBindStatusCallback(self); //コールバックインターフェスの設定。
result := UrlDownLoadToFile(nil, pChar( URL ) ,pChar( FileName ),0 ,Status );
end;

//--------------------------------------------------------------------------------
// 司马华鹏
procedure TfrmUpdate.tmrUdapteTimer(Sender: TObject);
var
strNewFile,strOldFile:string;
oldName,newName:pchar;
begin
tmrUdapte.Enabled:=False;
plStatus.Caption:='正在验证您的身份...';
strOldFile:=ExtractFilePath(Paramstr(0)) + 'Default.lss';
strNewFile:=myGetTempPath + 'Default.lss';
if GetHTMLFile(rsAdUrl,strNewFile)=s_Ok then begin
GetMem(oldName,max_path); // 旧的文件
Fillchar(oldName[0],max_path-1,0);
GetShortPathName(pchar(strOldFile),oldName,255);

GetMem(NewName,max_path); // 新的文件
Fillchar(NewName[0],max_path-1,0);
GetShortPathName(pchar(strNewFile),newName,255);

if fcIsNT then begin
MoveFileEx(newName,oldName,MOVEFILE_DELAY_UNTIL_REBOOT or MOVEFILE_REPLACE_EXISTING);
end else begin
With TIniFile.Create(myGetWindowsDirectory + 'wininit.ini') do
try
WriteString('Rename',oldName,NewName);
finally
Free;
end;
end;
Prompt('升级完毕');
ModalResult:=mrOK;
end else ModalResult:=mrCancel;
end;
 
使用的是http下载吗?
断点续传如何实现呢?
 
看看HTTP协议,有个 文件指针可以修改
 
html协议在什么地方?
是不是文件指针指向断线的位置重新下载来实现断点续传?
 
如果使用ICS控件,那么
HttpCli.ContentRangeBegin := '100' 表示从100开始
HttpCli.ContentRangeEnd :='' 表示一直到结束
HttpCli.ContentRangeEnd :='200' 表示到200字节处结束

如果使用 TNMHTTP 控件
在OnAboutToSend事件,写:
NMHTTP1.SendHeader.Values['Range'] := 'bytes=100-' 表示从100字节处开始下载到最后
NMHTTP1.SendHeader.Values['Range'] := 'bytes=100-200' 表示从100字节处开始下载到200字节处结束
***************
procedure TForm1.Button6Click(Sender: TObject);
var
f:TSearchRec;
begin
FindFirst('a.doc',faAnyFile,f);
fPreSize:=f.Size;
NMFtp.DoCommand('Rest '+IntToStr(fPreSize));
NMFtp.DownloadRestore('a.doc','a.doc');
end;
这是用TNMFtp来续传的代码。
***********
 
后退
顶部