工程内容:
通过程序手动同步局域网内某共享目录与本机目录的内容
目录内有多层子目录,包括2万多个文件,文件大小从1K-200M不等,部分文件名可能由中文开头
要求保证本机目录与源目录绝对相同,不得出现多余文件或目录,所有文件的修改时间与大小必须相同。我的做法:
分两条线程分别遍历远程及本机目录
将结果以 “相对路径+文件名|修改时间|大小” 的格式存入两个TSTRINGLIST内
然后对两个STRINGLIST进行比较
然后根据比较结果进行相应的文件复制或者删除操作
现在问题卡在STRINGLIST的比较上面,一直找不到合适的算法,希望大家出出主意
在此先谢过了,分不够的话另开帖再加
通过程序手动同步局域网内某共享目录与本机目录的内容
目录内有多层子目录,包括2万多个文件,文件大小从1K-200M不等,部分文件名可能由中文开头
要求保证本机目录与源目录绝对相同,不得出现多余文件或目录,所有文件的修改时间与大小必须相同。我的做法:
分两条线程分别遍历远程及本机目录
将结果以 “相对路径+文件名|修改时间|大小” 的格式存入两个TSTRINGLIST内
然后对两个STRINGLIST进行比较
然后根据比较结果进行相应的文件复制或者删除操作
现在问题卡在STRINGLIST的比较上面,一直找不到合适的算法,希望大家出出主意
在此先谢过了,分不够的话另开帖再加
樓主怎麼不用rsync.
http://mail.colocation.hinet.net/~happyman/RSYNC.html
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元。带一个游戏菜单。
光比效文件大小,時間是不准確的.
更新時為了效率考量, 最好只傳輸修改部份.
的确非常不错
pottos() 的方法很好,先研究一下
ahjoe(强哥)第二个回复给了我一些启发,也值得研究帖子再挂几天,如果没有更好的方案就结帖了
感谢各位的谈论
记得给文件名字段加索引
StringList太吃内存