如题:假如,开始我向对方传c:\a.rm文件,中途断掉,下次我传c:\directory\a.rm,虽然这两个文件名都是a.rm,但内容是完全不同的,那对方怎么知道是新的文件还是上次未传完的文件,或者说,是续传,还是重新传?
有什么比较高效且准确的方法判断吗?谢谢~~~~~

解决方案 »

  1.   

    如果你是自己写的客户端和服务器,那就简单了,客户端请求指定文件位置间的CRC值(MD5、HASH都可以)。服务器把计算出来的值发给客户端,客户端计算看看本地的和服务器是不是一样。当然简单的你可以用文件大小、修改时间来比较。
      

  2.   

    CRC值怎么算?有现成的代码吗?还有,用文件大小和时间能看出来吗?不行吧!!!!
      

  3.   

    CRC:
    http://www.vckbase.com/document/viewdoc/?id=970MD5数据校验
    http://www.vckbase.com/document/viewdoc/?id=1275
      

  4.   

    我认为不需要检测文件路径,只要是同一个文件,不管它位于什么位置,都应该可以用断点续传qq就是这样做的。不管前后两次传输文件是不是在同一个位置,只要是同样的文件内容,都算断点续传。
    关键是怎么判断前后两次是不是同一个文件,crc编码好象不行的,它只是一种编码。
    假如,我的文件为200MB,第一次传了10MB,第二次开始传,我怎么校验文件的crc码是不是原来那个?是不是要在接收端写个配置文件,保存这些信息呢?不解中!!!!
      

  5.   

    唯一识别文件的方法就是用MD5.
    "迅雷下载"就是靠MD5唯一识别文件的.就好比"身份证"?
    哈哈
      

  6.   

    1.客户端请求0-10M内容的Md5值,服务器计算出10M的MD5值,然后发给客户端。
    2.客户端比对MD5值一样,则内容相同。
      

  7.   

    回应以上各位。1.算md5值会不会效率很低?不知道算一个几百MB文件的md5值会用多长时间,要考虑效率问题。2.如果只比较0-10M的MD5,那如果其余部分不相同怎么办?这也应该不算断点续传吧。我用qq做过试验,只要在文件末尾加一个字母,qq都不算断点续传,所以,我认为,肯定不能只对已经传过的部分做md5,应该还有别的方法!
      

  8.   

    1.算md5值会不会效率很低?不知道算一个几百MB文件的md5值会用多长时间,要考虑效率问题。
    看机器的速度,主要是IO的速度。7200转的硬盘,200M约在十几秒。2.如果你要上次传的文件和这次一样的话,你可以在开始传的时候把整个文件MD5一次,把值告诉客户端。客户端记载某个地方。如果文件变了,那么在客户端收到的MD5值和上次保存的肯定不一样。
      

  9.   

    我觉得如果对大文件,全部内容做MD5,再进行传输,是很不明智的。那也太慢了吧??也许要花1分钟的时候做md5,然后再传?有没有其它快点的办法呢?再说,客户端把这些md5值存在哪里呢?有点麻烦啊
      

  10.   

    个人认为:1. 接受端先取得接受的文件的长度, 如果长度都不一致, 肯定不是同一个文件;
    2. 对发送的文件分块, 比如以256KB为单位, 分别计算出其MD5值;
    3. 接受端保存原始文件的若干MD5块的MD5值, 可以按照一定的间隔从原文件取得(如果文件过小, 可以减少块的数量, 或者直接验证所有的MD5块), 比如保存128个MD5块的值, 如果2个文件的这128块的MD5值都相同,而且文件长度也相同,那实在是非常巧合,没关系,我们还有方法,看下面.
    4.检查已接受的部分MD5值,判断是否相同,如果还相同,继续下面的步骤;
    5.老老实实的,完全检查已接受的数据,判断是否和原文件完全一致,如果一致,则认为是同一个文件.
      

  11.   

    1. 文件大小
    2. 文件名
    3. 服务器提供已接收部分的MD5,然后和客户端计算的MD5相对比。