工程内容:
通过程序手动同步局域网内某共享目录与本机目录的内容
目录内有多层子目录,包括2万多个文件,文件大小从1K-200M不等,部分文件名可能由中文开头
要求保证本机目录与源目录绝对相同,不得出现多余文件或目录,所有文件的修改时间与大小必须相同。我的做法:
分两条线程分别遍历远程及本机目录
将结果以 “相对路径+文件名|修改时间|大小”  的格式存入两个TSTRINGLIST内
然后对两个STRINGLIST进行比较
然后根据比较结果进行相应的文件复制或者删除操作
现在问题卡在STRINGLIST的比较上面,一直找不到合适的算法,希望大家出出主意
在此先谢过了,分不够的话另开帖再加

解决方案 »

  1.   

    好大的工程.
    樓主怎麼不用rsync.
    http://mail.colocation.hinet.net/~happyman/RSYNC.html
      

  2.   

    完全没有毕要这么做,用StringList反而慢。
    FileInfo=recored
     FileName:string;
     FileTime:TFileTime;
     FileSize:int64;
    end;
     FileSearth=Class
      public
       procedure Add(FilePath:string);
                 Delete(FilePath:string);           
      private
       Files:array of FileInfo;
      end;//---------
    Stringlist有太多功能你是用不上的,但是为了兼容这些功能会拖慢你的速度。
    特别是indexOf函数,它会遍历整个list里的数据至到找到你需要的值为止。对于两三万条数据用这个函数真是恶梦。我写过网吧里用的对比更新软件,用的是单线程的、纯Delphi7无任何第三方控件。如果你需要我出售给你,300元。带一个游戏菜单。
      

  3.   

    为了效率,你需要对 文件列表进行排序。www.ahjoe.com有个"同步专家单机版",免费的,你可下载使用。
      

  4.   

    比較文件是否相同需要使用某種diff算法.
    光比效文件大小,時間是不准確的.
    更新時為了效率考量, 最好只傳輸修改部份.
      

  5.   

    其实pottos() 和ahjoe(强哥) 两位的作品我早已观摩过
    的确非常不错
    pottos() 的方法很好,先研究一下
    ahjoe(强哥)第二个回复给了我一些启发,也值得研究帖子再挂几天,如果没有更好的方案就结帖了
    感谢各位的谈论
      

  6.   

    存到数据库来比较吧
    记得给文件名字段加索引
    StringList太吃内存
      

  7.   

    Beyond Compare 不错,可以参考一下
      

  8.   

    非要用TStrings的话,可以用IniFiles单元的THashStringList(TStrings的子类),不过得说明,这些全都不支持Unicode。
      

  9.   

    可以用TList来做,比较之前,至少先对一边排好序。这样查找的时候速度快。另一边可以不排序
      

  10.   

    TSTRINGLIST不支持unicode,特殊文件名会有问题!