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