电脑里"C:\A"  "D:\B" 2个目录(含子目录),原先这2个目录的结构内容完全一样.但是A目录的内容经常有变化(比如增删改文件/文件夹).如何写个程序才能让B目录也能跟A目录结构内容保持一致.(并不要求同步操作.)只要求手动操作这个程序的时候,能通过与A目录进行比较后来保持一致. 比较目录结构,文件的修改时间和大小.收集整个目录的结构和内容到是很快.比如目录(含子目录)6000多个文件(夹),把这些文件(夹)的路径名字+修改时间+文件大小字节数全部收集起来,只需要 2秒就搞定. 但是怎么比较这2个目录的结构内容的差异才快速呢?? 我的做法: 把A目录里的内容收集完毕后存放到一个数组里(保护路径文件名+修改时间+文件字节数),然后用B目录里的内容去与数组里的内容一一比较,发现不同的就先删除掉,发现相同的内容时从原来收集的A目录的数组里删除掉那个相应的值.等全部比较完毕后,再从那个已经删除掉相同值的数组里依次拷贝文件和目录到B目录下.这样就能做到目录保持一致了.但这样做,我觉得有些别扭,有没有更好更快的方法呢??毕竟如果文件(夹)太多了以后(50000个以上),这样做速度还是不快的.另外请教一下,我现在删除数组里的某个值,只是用赋予空值的方法,数组的下界并没有改变.有什么不影响速度的前提下,真正删除数组内某个值(数组下界跟着变),而不是象我现在用赋予空值的方法呢?

解决方案 »

  1.   

    REM 把A目录里的内容收集完毕后存放到一个数组里(保护路径文件名+修改时间+文件字节数),然后用B目录里的内容去与数组里的内容一一比较,发现不同的就先删除掉最好也把B目录里面的东西放到数组中。让两个数组比较,速度能快一些。减少磁盘操作。
      

  2.   

    to ryuginka(除了我谁敢用真名:刘银华) /FSO????/??什么意思. FSO有什么更快速的方法吗?我比较菜,FSO只会用一些它的简单方法,暂时想像不到它用在目录比较上有什么更快的方法.还请明示:)
      

  3.   

    你这种比较用数组是不合适的,可用集合:
    集合运算肯定会比数组慢,但在你这种情况,就不一定了。1、收集到的文件字符串不要放到数组中,而是用Add方法加入集合中,加入时使用相对路径做关键字;2、另一个目录中找出的文件,不用在集合中循环去查找,而是直接用关键字在集合中取字符串,前面加上On error Resume Next,在下一句用If Err=0 Then来判断是否存在,若存在,你就可用取出字符串进一步比较日期、大小等内容,若都相同,直接Remove掉这个项目,就行了。用此法,你只需对B目录中的文件进行一次循环就可以了。
      

  4.   

    to :Fashionxu呵呵,其实用B目录的内容去比较的过程,就跟收集到数组的过程一样,再放到数组里去倒多此一举了.它们的磁盘操作行为一样多:)
      

  5.   

    忘了提醒你,用关键字在集合中取字符串前,一定要记住加上Err.Clear,不然出现一次错误就会一直错误下去了。
      

  6.   

    to homezj(小吉): 首先谢谢你.
    但我刚才测试了用集合的方法,收集文件内容(50000多个文件)就比数组慢了一倍. 用数组16秒,用集合的add方法 31秒.请问一下,用关键字怎么直接取字符串.难道不用 for each ....next 吗?
      

  7.   

    这肯定会比数组慢,但你后面处理就快了!看来你还会用集合,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 nexterr.clear
    s=集合("123\456.exe")
    if err=0 then
    若没出错,则s="123\456.exe|" & "保存Time|" & "文件Size"
    else
    则说明没有,
    end if
      

  8.   

    你可以参考平台SDK中的windiff示例的源代码。
      

  9.   

    谢谢  homezj(小吉)remove 后面的参数index值我怎么取得?
      

  10.   

    呵呵,明白了.直接删key就可以了. 再次谢谢homezj(小吉). 明天我再测试一下速度和数组比如何.