2016-10-13 5 views
0

Я не люблю поиск win7 файл, так что я пытаюсь написать код для поиска файлов и папок с помощью шаблона, как *somechars*.doc*Поиск файлов дают System.UnauthorizedAccessException пытается получить доступ к защищенным папкам системы

Вот мой код :

'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 

Но это дает мне System.UnauthorizedAccessException, когда я установил корень (c:\, d:\ так далее) в качестве исходной папки.

я получаю ошибку при попытке доступа c:\Documents and Settings, но я хочу заметить, что я пытался получить доступ к этой папке с помощью проводника, но это запрещено (?)

Я также попытался использовать try - catch блок, но я не был» t получить коллекцию доступных папок: результат поиска всегда дает ничего.

Хорошим способом может быть пропустить все запрещенные папки, но мне нравится получать список всех пропущенных папок.

EDIT:

Я нашел полезную информацию 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 

EDIT 2:

Исключение возникает, когда код пытается открыть защищенную систему-папку (те каталоги, которые обычно не отображаются в проводнике). Итак, мой вопрос:
Как пропустить все защищенные системные папки во время поиска?
Поскольку при возникновении ошибки код прекращает поиск!

+0

Ваш вариант заключается в том, чтобы запрограммировать логику My.Computer.FileSystem.GetFiles и пропустить всю папку, к которой у вас нет доступа. [Это может помочь] (https://support.microsoft.com/ru-ru/kb/306666). –

+0

@the_lotus Спасибо за ссылку, но даже с помощью 'Directory.GetDirectories' и' Directory.GetFiles' некоторые данные по-прежнему отсутствуют: есть некоторые папки, которые недоступны, только если поиск начинается с root, но если я начну поиск с подкаталог, то я могу найти совпадение для шаблона. – genespos

+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 внутри цикла, что позволит код в продолжайте работать, если он встречает IOException. Вероятно, вы можете более точно определить тип ошибки на Catch, но я не помню точно, какой тип ошибки попадает в вашу ситуацию.

+0

Извините, но он по-прежнему останавливает поиск по ошибкам, так или иначе я рядом: я пропускаю папки, но дублировал результаты. Если я найду решение, я отправлю его – genespos

+0

, вам может понадобиться обернуть внутренний цикл одним и тем же блоком захвата try. Вы не указали точно, какая строка выбрасывает ошибку, поэтому я не был уверен, куда поместить код. –