Поиск файла в Vb.net и проблемы с UnauthorizedAccessException

Я пытаюсь найти букву диска (диск C) для файла в Vb.Net 2010. После того, как я найду путь к файлу, я хочу запустить исполняемый файл. Это код, который я пытаюсь использовать для поиска файла:

path = Convert.ToString(IO.Directory.GetFiles("C:\", "wswc.exe", System.IO.SearchOption.AllDirectories))

Это вызывает исключение UnauthorizedAccessException, когда мой код пытается выполнить поиск в корзине (или каком-либо другом файле, к которому у меня нет доступа), и я искал в Интернете, и люди предложили использовать Try...Catch...End Try, но это не сработает для меня, так как я не использую цикл и не знаю, как изменить свой код, чтобы он функционировал как цикл. Я видел, где было предложено использовать метод GetAccessControl для проверки разрешений перед поиском в каталоге, но я не был уверен, как использовать его с моим текущим кодом.

Мне не удалось протестировать Convert.ToString(...) из-за исключения UnauthorizedAccessException, поэтому, если что-то не так с этим или любым другим кодом, сообщите мне об этом.

Я новичок в VB.Net, поэтому постарайтесь, чтобы ваше объяснение было простым.

Спасибо.


person pulsar9    schedule 19.08.2011    source источник
comment
Этот код всегда будет нырять носом в информацию о томе c:\system. Каталог, в котором хранятся точки восстановления. Даже наличие прав администратора не позволяет вам заглянуть в него. Вам придется перебирать каталоги по одному, Directory.GetDirectories().   -  person Hans Passant    schedule 19.08.2011
comment
Как бы я это сделал? Что бы я сделал с Directory.GetDirectories()?   -  person pulsar9    schedule 19.08.2011


Ответы (2)


попробуй посмотреть эту тему

http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvb/thread/255be857-9d1e-4c80-9ae2-5c8b48697943/

С уважением.

person Carmelo La Monica    schedule 19.08.2011
comment
Я адаптировал код по ссылке, и он в основном работает. Теперь я получаю ошибку UnauthorizedAccessException для документов и настроек (я использую Windows 7). Я знаю, что могу добавить еще один оператор ElseIf, чтобы исключить это местоположение, но я хотел бы, чтобы программа проверила местоположение, а затем, если доступ запрещен, пропустить, иначе поиск в каталоге. Эта программа будет использоваться в Windows 7 и Windows XP, и я не хочу пропускать каталог, к которому я мог бы получить доступ в другой версии Windows. - person pulsar9; 19.08.2011
comment
Здравствуйте, если вы собираетесь использовать тот же тип кода, вы можете придумать, чтобы определить, какая операционная система и ее установили, и, следовательно, следует ли искать каталог, в котором нет проблем с XP, в то время как Windows7 может дать вам. С уважением - person Carmelo La Monica; 19.08.2011
comment
Я придумал, как адаптировать код для программного поиска и пропуска файлов, к которым он не может получить доступ. Жаль, что это не позволит мне искать папку Program Files с диска C. - person pulsar9; 20.08.2011
comment
Так как я не могу отредактировать свой комментарий выше: я начал поиск с папки Program Files, чтобы обойти это. Я думаю, что это будет работать на данный момент. Я, вероятно, попытаюсь начать поиск в каталогах, к которым у меня нет доступа, но которые, вероятно, содержат файл, который я ищу. - person pulsar9; 20.08.2011
comment
Дело в том, что в последующих версиях продукта для Windows XP были включены права доступа, одна из них и папка ProgramFiles в Windows 7, которой нет в Windows XP, вы все равно можете нащупать, что они делают, и запустить свое приложение, начиная с прав администратора.С уважением - person Carmelo La Monica; 20.08.2011

Первоначально я задал этот вопрос, и у меня есть код, который теперь ищет файл во всех каталогах. Я чувствую себя обязанным опубликовать фактический код, чтобы кто-то с похожей проблемой мог использовать мой. Я использую другую учетную запись, потому что не могу войти в ту, которую создал. Вам нужно четыре списка, чтобы запустить этот код.

    'Run the file if found
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim path As String

    'Search for a specified file
    Start_Search(ListBox1)

    For k = 0 To ListBox2.Items.Count - 1
        Try
            ListBox2.SelectedIndex = k
            path = ListBox2.SelectedItem.ToString
            System.Diagnostics.Process.Start(path)
        Catch ex As Exception
        End Try
    Next
    Quit()

End Sub

    'Set the root of your search
    Private Sub Start_Search(ByVal listbox1 As ListBox)
    Dim strroot As String
    strroot = "C:\"
    listbox1.Items.Add(strroot)
    Search(listbox1, ListBox2)
    End Sub

    'Search all directories and sub-directories in the search root(s)
    Private Sub Search(ByVal listbox1 As ListBox, ByVal listbox2 As ListBox)
    Dim listbox4 As New ListBox

    'Get all sub-directories of all items in your search root(s) (listbox1), 
    'clear listbox1, copy all sub-directories into listbox1 
    For j = 0 To listbox1.Items.Count - 1
        listbox1.SelectedIndex = j
        Try
            For Each strfolder As String In   My.Computer.FileSystem.GetDirectories(listbox1.SelectedItem.ToString)
            listbox4.Items.Add(strfolder)
            Dim junk = listbox4.Items.Count - 1
            Next
        Catch ex As Exception
        End Try
    Next
    listbox1.Items.Clear()
    listbox1 = listbox4

    'every directory that throws an UnauthorizedAccessException is 
    'placed into listbox3. Then there is a recursive call on listbox3 
    '
    For i = 0 To listbox1.Items.Count - 1
        Try
            listbox1.SelectedIndex = i
    'You can place the file you are looking for in this line
            listbox2.Items.AddRange(System.IO.Directory.GetFiles(listbox1.SelectedItem.ToString & "\", "File to Find.exe", System.IO.SearchOption.AllDirectories))
        Catch ex As UnauthorizedAccessException
            ListBox3.Items.Add(listbox1.SelectedItem.ToString)
        Catch ex1 As Exception
        End Try

    Next
    If listbox2.Items.Count > 0 Then
        Return
    ElseIf ListBox3.Items.Count >= 0 Then
        Search(ListBox3, listbox2)
    End If
    Return
End Sub

Я надеюсь, что этот код может быть кому-то полезен. У меня сработало, но могут быть ошибки. Спасибо за вашу помощь Кармело Ла Моника.

person pulsar27    schedule 01.09.2011
comment
Привет, Pulsar27. Добро пожаловать. С наилучшими пожеланиями - person Carmelo La Monica; 01.09.2011