标题:[求助]FSO递归遍历所有驱动器下所有文件夹中所有文件
只看楼主
mzjllh
Rank: 2
来 自:江苏扬州
等 级:论坛游民
帖 子:76
专家分:41
注 册:2007-2-8
 问题点数:0 回复次数:2 
[求助]FSO递归遍历所有驱动器下所有文件夹中所有文件
小弟在使用FSO递归遍历所有驱动器下所有文件夹中所有文件时,执行到最后时出现类似死循环现象,请高手指点。
代码如下:

dim FSO as object
dim AllDrives as object
Set FSO= CreateObject("Scripting.FileSystemObject")
set AllDries=FSO.Drives
'处理过程,列举所有驱动器,并对每一个驱动器的根文件夹调用SCAN过程。
Private Sub Process()
    Dim drive As Object
    For Each drive In AllDrives
        If drive.isready Then
           Call Scan(drive.rootfolder)'此处调用遍历过程
        End If
    Next
End Sub
'递归遍历每个文件夹及其子文件夹,并用一个LABEL显示其中每一个文件的路径。
Private Sub Scan(folder)
    Dim subfolder
    Dim thefile
    Dim filename
    If folder.subfolders.Count > 0 Then
        For Each subfolder In folder.subfolders
            Call Scan(subfolder)'此处递归
        Next
    End If
    '下面一段将文件夹中的文件路径显示在LABEL上并刷新窗体
    If folder.Files.Count > 0 Then
        For Each thefile In folder.Files
            MessageLabel.Caption = thefile.Path
            MainForm.Refresh
        Next
    End If
End Sub

[[italic] 本帖最后由 mzjllh 于 2007-12-20 20:12 编辑 [/italic]]
搜索更多相关主题的帖子: 遍历 FSO递归 文件夹 驱动器 drive 
2007-12-20 19:44
mzjllh
Rank: 2
来 自:江苏扬州
等 级:论坛游民
帖 子:76
专家分:41
注 册:2007-2-8
得分:0 
高手指点一下啊,谢谢啦。
2007-12-21 22:05
mzjllh
Rank: 2
来 自:江苏扬州
等 级:论坛游民
帖 子:76
专家分:41
注 册:2007-2-8
得分:0 
[问题解决]递归过程中少了一个doevents关键字
问题解决啦,原来是递归过程中少了一个doevents关键字,毕竟是新手啊,还请大家多指教。
现将问题总结如下:
1.问题描述:使用FSO递归遍历机器各驱动器的各目录及其子目录中的文件,在处理过程中出现类似死循环现象,但一段时间后当跳出递归后又恢复。其中有个细节我当时没有发现,就是在递归开始时如果鼠标不动就不会出现上述情况,而在鼠标移动或做点击、拖拽等操作时才出现。
2.解决方法:在遍历过程的代码循环中上 DoEvents关键字。代码如下:
Private Sub Scan(folder)
    Dim subfolder
    Dim thefile
    Dim filename
    DoEvents  '请注意在这里加上关键字DoEvents
    If folder.subfolders.Count > 0 Then
        For Each subfolder In folder.subfolders
            Call Scan(subfolder)'此处递归
        Next
    End If
    '下面一段将文件夹中的文件路径显示在LABEL上并刷新窗体
    If folder.Files.Count > 0 Then
        For Each thefile In folder.Files
            MessageLabel.Caption = thefile.Path
            MainForm.Refresh
        Next
    End If
End Sub
3.问题总结:在循环运行时,窗体上的任何事件是不被响应的,一旦有事件发生,就会出现假死情况,如果在循环中加上DoEvents关键字,就可以让窗体暂时释放CPU以处理当前事件。我本来认为这个问题与FSO 的递归调用层数有关,现在看来当时是走错方向了。
4.经验教训:首先要认真观察程序的运行细节,找出问题切入点,或者说是突破口。其次,要注意程序代码的严谨性,问题的关键有可能只是一些小的破绽造成的。第三,要多看书,多看帖,多学习,多练习,基础扎实才能写出好程序。

小弟新手,说的不知道对不对,请多指教。
2007-12-22 21:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-193570-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.358728 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved