我不喜欢win7文件搜索,因此我尝试使用类似*somechars*.doc*
这是我的代码:
'Look for files
If Me.CBox_Files.Checked Then
For Each foundFile As String In My.Computer.FileSystem.GetFiles(
Me.TB_StartFolder.Text,
FileIO.SearchOption.SearchAllSubDirectories,
Me.TB_Pattern.Text)
LB_Files.Items.Add(foundFile)
Next
End If
'Look for folders
If Me.CBox_Folders.Checked Then
For Each Dir As String In Directory.GetDirectories(Me.TB_StartFolder.Text, Me.TB_Pattern.Text)
LB_Folders.Items.Add(Dir)
Next
End If
但是当我将root(System.UnauthorizedAccessException
,c:\
等设置为启动文件夹)时,它会给我d:\
。
我在尝试访问c:\Documents and Settings
时遇到错误,但我想注意我已尝试使用资源管理器访问此文件夹但禁止访问(?)
我还尝试使用try - catch
块,但我无法获得可访问文件夹的集合:搜索结果始终没有。
一个好方法可能是跳过所有禁用的文件夹,但我想得到所有跳过的文件夹列表。
修改
我找到了有用的信息here,但是找到了代码,即使可以访问,似乎也会跳过某些文件夹:
例如:如果我将桌面设置为开始文件夹,我可以在桌面上找到一个文件夹,但是如果我将C:\设置为开始文件夹,则找不到桌面上的文件夹。
我也尝试过这段代码(我得到同样的错误)
Sub FileSearch(ByVal sDir As String)
Dim d As String
Dim f As String
Try
For Each f In Directory.GetFiles(sDir, Me.TB_Pattern.Text)
LB_Files.Items.Add(f)
Next
For Each d In Directory.GetDirectories(sDir)
For Each f In Directory.GetFiles(d, Me.TB_Pattern.Text)
LB_Files.Items.Add(f)
If LB_Files.Items.Count > CInt(Me.CboBox_Limit.SelectedItem) Then
Exit Sub
End If
Next
FileSearch(d)
Next
Catch excpt As System.Exception
If Not d Is Nothing AndAlso d <> "" Then
LB_SkippedFolders.Items.Add(d)
End If
End Try
End Sub
编辑2:
当代码尝试打开受保护的系统文件夹(那些通常不在资源管理器中显示的目录)时,会引发异常。
所以,我的问题是:
如何在搜索时跳过所有受保护的系统文件夹?
因为当引发错误时代码停止搜索!
答案 0 :(得分:0)
如果您只想跳过任何抛出错误的目录,可以这样做:
For Each d In Directory.GetDirectories(sDir)
Try
For Each f In Directory.GetFiles(d, Me.TB_Pattern.Text)
Try
LB_Files.Items.Add(f)
If LB_Files.Items.Count > CInt(Me.CboBox_Limit.SelectedItem) Then
Exit Sub
End If
Catch ex as IOException
'This executes where there was an IO error
End Try
Next
FileSearch(d)
Catch ex as IOException
'This executes where there was an IO error
End Try
Next
我在你的循环中添加了一个Try / Catch块,如果它遇到IOException
,它将允许代码继续运行。您可能会更加具体地了解Catch
上的错误类型,但我不记得在您的情况下究竟会出现什么类型的错误。