2013-04-26 114 views
0

正如标题所说,任何人都知道如何克服这个错误?这是使用Visual Basic和似乎无法找到一个答案,这是我的第一个程序...visual basic 2010 |继续出现错误(UnauthorizedAccessException)

试图

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles GetProfiles_Button.Click 
      For Each fileName As String In FileIO.FileSystem.GetDirectories("C:\", FileIO.SearchOption.SearchAllSubDirectories) 
       CheckedListBox1.Items.Add(fileName) 
       On Error Resume Next 
      Next 
    End Sub 
End Class 

我试着

Public Class Form1 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles GetProfiles_Button.Click 
     Try 
      For Each fileName As String In FileIO.FileSystem.GetDirectories("C:\", FileIO.SearchOption.SearchAllSubDirectories) 
       CheckedListBox1.Items.Add(fileName) 
      Next 
     Catch ex As UnauthorizedAccessException 
      MsgBox("Unable to access " & ex.Message) 
     End Try 
    End Sub 
End Class 

我想我可以做一个通过创建一个测试每个文件夹的循环来解决这个问题,但是这将会是相当多的代码,并且效率很低......任何建议?

+0

这显然不是VBA!请重新提出您的问题。 – 2013-04-26 13:12:24

+0

对不起,你能解释一下你想用你的代码做什么? – misleadingTitle 2013-04-26 13:19:31

+0

'GetDirectories'返回目录名称而不是文件名称。你真的想要什么? – 2013-04-26 13:22:22

回答

1

您可以像GetFilesGetDirectories文件方法得到多个例外。

一些可能的例外(from

  • 一些路(长全1 PathTooLongException)的不被CLR支持
  • 上的文件夹/文件重复引进
  • 路口/硬链接的安全性限制(并且在理论上循环以递归迭代的方式来处理StackOverflow)。
  • 基本共享冲突的限制(如果你尝试读取文件)。

您必须手动遍历所有文件和文件夹:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    Dim allCFileName = FindAllFiles("C:\") 
    For Each fileName As String In allCFileName 
     CheckedListBox1.Items.Add(fileName) 
    Next 
End Sub 

Public Shared Function FindAllFiles(rootDir As String) As String() 
    Dim paths = New Queue(Of String)() 
    Dim fileNames = New List(Of String)() 

    paths.Enqueue(rootDir) 

    While paths.Count > 0 
     Dim dir = paths.Dequeue() 

     Try 
      Dim files = Directory.GetFiles(dir) 
      For Each file As String In Directory.GetFiles(dir) 
       fileNames.Add(file) 
      Next 

      For Each subDir As String In Directory.GetDirectories(dir) 
       paths.Enqueue(subDir) 
      Next 
     Catch unauthorizedAccessException As UnauthorizedAccessException 
      ' log the exception or ignore it 
      Console.WriteLine("Directory {0} could not be accessed!", dir) 
     Catch generalException As Exception 
      ' log the exception or ... 
      Throw 
     End Try 
    End While 

    Return fileNames.ToArray() 
End Function 
+0

我在想什么类似的东西,但它似乎效率太低了......以为有一个更简单的解决方案,我只是不断俯瞰。接受答案并投票表决,谢谢。 – user1451070 2013-04-26 13:33:41

+0

@ user1451070:为什么它应该比'SearchOption.SearchAllSubDirectories'更低效?代码只是更长。 – 2013-04-26 13:37:49

0
Try 
    For Each path As String In filePath 
     If File.Exists(path) Then 
      ' This path is a file 
      ProcessFile(path) 
     ElseIf Directory.Exists(path) Then 
      ' This path is a directory 
      ProcessDirectory(path) 
     Else 
      Console.WriteLine("{0} is not a valid file or directory.", path) 
     End If 
     Next 
Catch ex As UnauthorizedAccessException 
    MsgBox("Unable to access " & ex.Message) 
End Try 


Public Shared Sub ProcessDirectory(targetDirectory As String) 
    ' Process the list of files found in the directory. 
    Dim fileEntries As String() = Directory.GetFiles(targetDirectory) 
    For Each fileName As String In fileEntries 
     ProcessFile(fileName) 
    Next 

    ' Recurse into subdirectories of this directory. 
    Dim subdirectoryEntries As String() = Directory.GetDirectories(targetDirectory) 
    For Each subdirectory As String In subdirectoryEntries 
     ProcessDirectory(subdirectory) 
    Next 
End Sub 


Public Shared Sub ProcessFile(path As String) 
    File.Exists(path) 
End Sub 

这将访问所有的目录,子目录和文件。如果您无法访问该文件,Files.Exists应该返回false,因此您还应该检查该文件。