Это seems like FileSystem.GetFiles() не может восстановить из исключения UnauthorizedAccessException, что .Net запускает при попытке доступа к каталогу вне пределов.Ошибка FileSystem.GetFiles() + UnauthorizedAccessException?
В этом случае это означает, что этот класс/метод не пригодится при сканировании всего диска, и я должен использовать другое решение (в этом случае: какой?)?
Вот код, чтобы показать проблему:
Private Sub bgrLongProcess_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgrLongProcess.DoWork
Dim drive As DriveInfo
Dim filelist As Collections.ObjectModel.ReadOnlyCollection(Of String)
Dim filepath As String
'Scan all fixed-drives for MyFiles.*
For Each drive In DriveInfo.GetDrives()
If drive.DriveType = DriveType.Fixed Then
Try
'How to handle "Access to the path 'C:\System Volume Information' is denied." error?
filelist = My.Computer.FileSystem.GetFiles(drive.ToString, FileIO.SearchOption.SearchAllSubDirectories, "MyFiles.*")
For Each filepath In filelist
DataGridView1.Rows.Add(filepath.ToString, "temp")
'Trigger ProgressChanged() event
bgrLongProcess.ReportProgress(0, filepath)
Next filepath
Catch Ex As UnauthorizedAccessException
'How to ignore this directory and move on?
End Try
End If
Next drive
End Sub
Спасибо.
Edit: Что об использовании Try/Поймать только, чтобы иметь GetFiles() заполнить массив, игнорировать исключение и только резюме?
Private Sub bgrLongProcess_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgrLongProcess.DoWork
'Do lengthy stuff here
Dim filelist As Collections.ObjectModel.ReadOnlyCollection(Of String)
Dim filepath As String
filelist = Nothing
Try
filelist = My.Computer.FileSystem.GetFiles("C:\", FileIO.SearchOption.SearchAllSubDirectories, "MyFiles.*")
Catch ex As UnauthorizedAccessException
'How to just ignore this off-limit directory and resume searching?
End Try
'Object reference not set to an instance of an object
For Each filepath In filelist
bgrLongProcess.ReportProgress(0, filepath)
Next filepath
End Sub
Спасибо за подсказку, но я прочитал, что Try/Catch дорогостоящий и не должен быть помещен в цикл. Как насчет использования Try/Catch только для заполнения массива с помощью FileSystem.GetFiles()? – Gulbahar
Спасибо, я проверю GetAccessControl, чтобы возобновить работу в случае, если этот каталог отключен. – Gulbahar