0

タイトルが示すように、このエラーを回避する方法を知っている人はいますか? これは、Visual Basic を使用する私の最初のプログラムであり、これに対する答えが見つからないようです...

試した

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

すべてのフォルダーをテストするループを作成することで回避できると思いますが、それはかなり多くのコードになり、非常に非効率的です...何か提案はありますか?

4

2 に答える 2

1

GetFilesまたはのようなファイルメソッドで複数の例外を取得できますGetDirectories

考えられる例外の一部 (から)

  • 一部のパス (長いパス - 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
于 2013-04-26T13:30:45.207 に答える