电脑里"C:\A" "D:\B" 2个目录(含子目录),原先这2个目录的结构内容完全一样.但是A目录的内容经常有变化(比如增删改文件/文件夹).如何写个程序才能让B目录也能跟A目录结构内容保持一致.(并不要求同步操作.)只要求手动操作这个程序的时候,能通过与A目录进行比较后来保持一致. 比较目录结构,文件的修改时间和大小.收集整个目录的结构和内容到是很快.比如目录(含子目录)6000多个文件(夹),把这些文件(夹)的路径名字+修改时间+文件大小字节数全部收集起来,只需要 2秒就搞定. 但是怎么比较这2个目录的结构内容的差异才快速呢?? 我的做法: 把A目录里的内容收集完毕后存放到一个数组里(保护路径文件名+修改时间+文件字节数),然后用B目录里的内容去与数组里的内容一一比较,发现不同的就先删除掉,发现相同的内容时从原来收集的A目录的数组里删除掉那个相应的值.等全部比较完毕后,再从那个已经删除掉相同值的数组里依次拷贝文件和目录到B目录下.这样就能做到目录保持一致了.但这样做,我觉得有些别扭,有没有更好更快的方法呢??毕竟如果文件(夹)太多了以后(50000个以上),这样做速度还是不快的.另外请教一下,我现在删除数组里的某个值,只是用赋予空值的方法,数组的下界并没有改变.有什么不影响速度的前提下,真正删除数组内某个值(数组下界跟着变),而不是象我现在用赋予空值的方法呢?
集合运算肯定会比数组慢,但在你这种情况,就不一定了。1、收集到的文件字符串不要放到数组中,而是用Add方法加入集合中,加入时使用相对路径做关键字;2、另一个目录中找出的文件,不用在集合中循环去查找,而是直接用关键字在集合中取字符串,前面加上On error Resume Next,在下一句用If Err=0 Then来判断是否存在,若存在,你就可用取出字符串进一步比较日期、大小等内容,若都相同,直接Remove掉这个项目,就行了。用此法,你只需对B目录中的文件进行一次循环就可以了。
但我刚才测试了用集合的方法,收集文件内容(50000多个文件)就比数组慢了一倍. 用数组16秒,用集合的add方法 31秒.请问一下,用关键字怎么直接取字符串.难道不用 for each ....next 吗?
如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 nexterr.clear
s=集合("123\456.exe")
if err=0 then
若没出错,则s="123\456.exe|" & "保存Time|" & "文件Size"
else
则说明没有,
end if