最近做一个项目,Client需要从服务器上面下载更新的文件(文件上百兆)。 设置了断点续传,经实际测试,client端突然断电 或者死机writefile 会造成下载的文件块很大一块都是空的 下次继续下载 就接着空的那一块末尾开始下。 最终造成下载的文件出错。 
找了下这方面的资料,跟WINDOWS I/O缓存机制有关,读写文件的时候都丢进缓存了,而断电的时候正好没有写入. 
解决的方案暂时想到二个 
一 由于文件很大,不可能整个一个效验,断点续传的时候加入CRC32从文件末尾开始读1024*N的数据 到服务器上效验,直到正确为止。(算法很笨,遇到文件中很长一段为0的时候CRC32值正确,效验就出错了) 
二 写IO驱动,拦截写入函数的操作做计数处理。(太复杂) 
急求做过这方面的朋友给个完美解决方案。分不够在加  直到解决为止。 

解决方案 »

  1.   

    你的方式是 文件共享写入?还是http/ftp的服务端的写入程序?
    如果是单线程顺序写的话,可以每次在写了一块之后,额外把文件(假设名为abc.bin)关一次,再把它的字节数写入一个小文件(abc.bin.len),然后追加写下一快。
      

  2.   

    是的  共享写入 这有什么影响吗    按你的方法 把文件关一次  closehandle 是这个意思吗?   句柄关了之后就强制保存了? 
      

  3.   

    对,另外,还有一个小文件(abc.bin.len),双保险