Я не люблю поиск 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:
Исключение возникает, когда код пытается открыть защищенную систему-папку (те каталоги, которые обычно не отображаются в проводнике). Итак, мой вопрос:
Как пропустить все защищенные системные папки во время поиска?
Поскольку при возникновении ошибки код прекращает поиск!
Ваш вариант заключается в том, чтобы запрограммировать логику My.Computer.FileSystem.GetFiles и пропустить всю папку, к которой у вас нет доступа. [Это может помочь] (https://support.microsoft.com/ru-ru/kb/306666). –
@the_lotus Спасибо за ссылку, но даже с помощью 'Directory.GetDirectories' и' Directory.GetFiles' некоторые данные по-прежнему отсутствуют: есть некоторые папки, которые недоступны, только если поиск начинается с root, но если я начну поиск с подкаталог, то я могу найти совпадение для шаблона. – genespos
Странно, похоже, что у вас нет доступа к родительской папке, но у вас есть доступ к его дочерней папке. В этом случае мало что можно сделать. –