如何快速比较2个目录的不同.

zolen 2004-12-15 07:30:50
电脑里"C:\A" "D:\B" 2个目录(含子目录),原先这2个目录的结构内容完全一样.但是A目录的内容经常有变化(比如增删改文件/文件夹).如何写个程序才能让B目录也能跟A目录结构内容保持一致.(并不要求同步操作.)只要求手动操作这个程序的时候,能通过与A目录进行比较后来保持一致. 比较目录结构,文件的修改时间和大小.

收集整个目录的结构和内容到是很快.比如目录(含子目录)6000多个文件(夹),把这些文件(夹)的路径名字+修改时间+文件大小字节数全部收集起来,只需要 2秒就搞定. 但是怎么比较这2个目录的结构内容的差异才快速呢??

我的做法: 把A目录里的内容收集完毕后存放到一个数组里(保护路径文件名+修改时间+文件字节数),然后用B目录里的内容去与数组里的内容一一比较,发现不同的就先删除掉,发现相同的内容时从原来收集的A目录的数组里删除掉那个相应的值.等全部比较完毕后,再从那个已经删除掉相同值的数组里依次拷贝文件和目录到B目录下.这样就能做到目录保持一致了.

但这样做,我觉得有些别扭,有没有更好更快的方法呢??毕竟如果文件(夹)太多了以后(50000个以上),这样做速度还是不快的.

另外请教一下,我现在删除数组里的某个值,只是用赋予空值的方法,数组的下界并没有改变.有什么不影响速度的前提下,真正删除数组内某个值(数组下界跟着变),而不是象我现在用赋予空值的方法呢?
...全文
196 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zolen 2004-12-15
  • 打赏
  • 举报
回复
呵呵,明白了.直接删key就可以了. 再次谢谢homezj(小吉). 明天我再测试一下速度和数组比如何.
zolen 2004-12-15
  • 打赏
  • 举报
回复
谢谢 homezj(小吉)

remove 后面的参数index值我怎么取得?
蒋晟 2004-12-15
  • 打赏
  • 举报
回复
你可以参考平台SDK中的windiff示例的源代码。
homezj 2004-12-15
  • 打赏
  • 举报
回复
这肯定会比数组慢,但你后面处理就快了!

看来你还会用集合,add时不是同时加上了Key吗?
如A目录下,有个文件 “A目录\123\456.exe”,加入集合就用
集合.Add "123\456.exe|" & "保存Time|" & "文件Size","123\456.exe"
注意“123\456.exe”这个相对路径就是关键字,

当你在B目录下找到一个“B目录\123\456.exe”时,若想判断其在A中有没有,只需:
on error resume next

err.clear
s=集合("123\456.exe")
if err=0 then
若没出错,则s="123\456.exe|" & "保存Time|" & "文件Size"
else
则说明没有,
end if
zolen 2004-12-15
  • 打赏
  • 举报
回复
to homezj(小吉): 首先谢谢你.
但我刚才测试了用集合的方法,收集文件内容(50000多个文件)就比数组慢了一倍. 用数组16秒,用集合的add方法 31秒.

请问一下,用关键字怎么直接取字符串.难道不用 for each ....next 吗?
homezj 2004-12-15
  • 打赏
  • 举报
回复
忘了提醒你,用关键字在集合中取字符串前,一定要记住加上Err.Clear,不然出现一次错误就会一直错误下去了。
zolen 2004-12-15
  • 打赏
  • 举报
回复
to :Fashionxu

呵呵,其实用B目录的内容去比较的过程,就跟收集到数组的过程一样,再放到数组里去倒多此一举了.它们的磁盘操作行为一样多:)
homezj 2004-12-15
  • 打赏
  • 举报
回复
你这种比较用数组是不合适的,可用集合:
集合运算肯定会比数组慢,但在你这种情况,就不一定了。

1、收集到的文件字符串不要放到数组中,而是用Add方法加入集合中,加入时使用相对路径做关键字;

2、另一个目录中找出的文件,不用在集合中循环去查找,而是直接用关键字在集合中取字符串,前面加上On error Resume Next,在下一句用If Err=0 Then来判断是否存在,若存在,你就可用取出字符串进一步比较日期、大小等内容,若都相同,直接Remove掉这个项目,就行了。

用此法,你只需对B目录中的文件进行一次循环就可以了。
zolen 2004-12-15
  • 打赏
  • 举报
回复
to ryuginka(除了我谁敢用真名:刘银华) /FSO????/

??什么意思. FSO有什么更快速的方法吗?我比较菜,FSO只会用一些它的简单方法,暂时想像不到它用在目录比较上有什么更快的方法.还请明示:)
Fashionxu 2004-12-15
  • 打赏
  • 举报
回复
REM 把A目录里的内容收集完毕后存放到一个数组里(保护路径文件名+修改时间+文件字节数),然后用B目录里的内容去与数组里的内容一一比较,发现不同的就先删除掉

最好也把B目录里面的东西放到数组中。让两个数组比较,速度能快一些。减少磁盘操作。
kmzs 2004-12-15
  • 打赏
  • 举报
回复
一时间没思路。。。
dongge2000 2004-12-15
  • 打赏
  • 举报
回复
UP
ryuginka 2004-12-15
  • 打赏
  • 举报
回复
fso
viena 2004-12-15
  • 打赏
  • 举报
回复
我觉得可以呀,为什么会慢呢?

/*有什么不影响速度的前提下,真正删除数组内某个值(数组下界跟着变)*/
做不到

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧