搜索文件会导致System.UnauthorizedAccessException尝试访问受保护的系统文件夹

时间:2016-10-13 07:43:52

标签: vb.net search unauthorized

我不喜欢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.UnauthorizedAccessExceptionc:\等设置为启动文件夹)时,它会给我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:

当代码尝试打开受保护的系统文件夹(那些通常不在资源管理器中显示的目录)时,会引发异常。 所以,我的问题是:
如何在搜索时跳过所有受保护的系统文件夹? 因为当引发错误时代码停止搜索!

1 个答案:

答案 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上的错误类型,但我不记得在您的情况下究竟会出现什么类型的错误。