我在盒子上面下了几个代码,自己也看了下,有些哥们传的代码就是用Indy控件支持的断点,哎。我现在的理解:C2S的请求中带上本地临时文件的大小,S收到后,根据这个大小seek到这个位置。
第一个问题:这个大小是用一个stream来读本地临时文件,需要减去1不(我看了几份代码,有人减去了1的)?貌似迅雷采用的另外一个文件.cfg来保存这个信息第二个问题:本地保存文件用TFileStream还是TMemoryStream还一些?我知道2个都可以我现在暂时用的内存流第三个问题:本地临时文件,打开的那个流,要是遇到文件特别大,比如bds2007.iso 4个多G,怎么预防流的溢出?暂时三个问题。求 解答的兄弟 别说直接用Indy,还是自己用sockAPI来写。谢谢合作,也谢谢解答

解决方案 »

  1.   

    第一个问题:这个大小是用一个stream来读本地临时文件,需要减去1不(我看了几份代码,有人减去了1的)?貌似迅雷采用的另外一个文件.cfg来保存这个信息 
    >>如果是单断点,即可以保证只有一个作业按从头到尾的顺序下载的话,可以用API SetFilePointer来取得现有文件的大小,当然这是指内存当中没有相关断点信息的时候;如果是多断点,则使用一个附加的断点信息文件,这也是指离线的时候进行保存,正常运行的时候,断点信息存储于内存当中.第二个问题:本地保存文件用TFileStream还是TMemoryStream还一些?我知道2个都可以我现在暂时用的内存流 
    >>TMemorStream先进行缓存,达到一定大小比如4MB之后再写入文件,可以加快操作,并且也使得磁盘写入次数减少,和一次性写入较连续的磁盘扇区而保护磁盘.第三个问题:本地临时文件,打开的那个流,要是遇到文件特别大,比如bds2007.iso 4个多G,怎么预防流的溢出? 
    >>写入文件以追加模式写入,并不需要Load到内存.
    CreateFile 打开一个文件操作句柄
    SetFilePointer 调整到特定的位置
    WriteFile 写入