下载文件的过程等同于打开一个远程文件,分块读取,写入本地文件,关闭远程文件。分段下载的原理是这样的:首先取得远程文件的长度,然后移动文件指针比如100个字节,如果成功,表示支持断点续传,可以分段下载,否则不支持断点续传,只能连续下载。
如果支持断点续传,通过一个分段策略(比如文件长度小于10K就不分段等等)将文件平分为n段,然后创建n个线程,每个线程都打开远程文件,将文件指针移动到本线程负责的分段的首位置,开始读取文件,直至本分段内容读取完成。如果此时其它线程工作还没有完成,可以选择其中一个最长的分段再一分为二,接管后面那段继续工作。
还应该有一个总管线程,负责监视当前每个下载线程已读取的字节数,如果超过一个规定的数值(比如100K),就将已读取的字节写入本地文件相应的位置,然后刷新各线程的工作状态,保证读取文件的同步。

解决方案 »

  1.   

    原理应该说得很清楚了,再详细就涉及到编码了。你可以看一下CInternetSession,CHttpConnection,CFtpConnection,CInternetFile这几个类,串接在一起就能完成下载远程文件的工作。得到打开的CInternetFile就可以象正常文件操作那样移动文件指针(实现分段下载、断点续传等)、读取等。其中对FTP有一些特殊,不支持文件指针移动,一般通过创建Socket连接,然后发送FTP命令的方式实现,具体FTP命令的使用可以用一些常用的FTP工具象CuteFTP,BulletFTP等实际下载一个文件,它们的记录窗口中都有显示具体命令发送的过程(包括文件指针移动),用网络蚂蚁看一下也行。
      

  2.   

    不错,用断点续传可以解决这个问题。
    清华出版的一本叫做《因特网应用编程》的书(在海店读书城可以买到)中有这方面的解释。
    它里面有实现断点续传的HTTP和FTP服务器的例子,不过是用VC++编写的。我已将这些例子
    发送给你了,不知是否有帮助。
      

  3.   

    多谢blind_man,等我研究一下。