2013-04-26 150 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,因此您還應該檢查該文件。