2013-04-26 2 views
0

제목과 마찬가지로이 오류를 피하는 법을 아는 사람이 있습니까? 나는 내가 할 수 있다고 생각이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 

시도 Visual Basic 및이에 대한 답을 찾을 수 없습니다를 사용하여 내 첫 번째 프로그램 ...

내가

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가 아닙니다! 질문에 다시 답하십시오. –

+0

죄송합니다.하지만 코드로 무엇을하려고 하시겠습니까? – misleadingTitle

+0

'GetDirectories'는 파일 이름이 아닌 디렉토리 이름을 반환합니다. 너 정말로 원하는게 뭐야? –

답변

1

GetFiles 또는 GetDirectories과 같은 파일 메서드에서 여러 예외가 발생할 수 있습니다.

가능한 예외 (from)

  • 일부 경로 (긴로만 구성된 경우 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

+0

@ user1451070 : 왜 'SearchOption.SearchAllSubDirectories'를 사용하는 것보다 효율적이지 않은가? 코드가 오래되었습니다. –

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를 반환해야하므로 해당 파일도 확인해야합니다.

관련 문제