0

重複の可能性:
Directory.GetFiles() がアクセスを拒否された場合、フォルダー/ファイルを無視する

特定のフォルダー内のファイルをループするこの例があります。

Imports system.IO
Dim Files() as string = Directory.GetFiles("D:\example","*.*",SearchOption.AllDirectories)
For Each S As String in Files
Listbox1.Items.Add(S)
Next

その時点まではすべて問題ありません。しかし、問題はここにあります: ユーザーがトップ フォルダ (ドライブ「D:\」など) を選択した場合、コードは次のようになります。

Imports system.IO
    Dim Files() as string = Directory.GetFiles("D:\","*.*",SearchOption.AllDirectories)
    For Each S As String in Files
    Listbox1.Items.Add(S)
    Next

保護されたフォルダ「システム ボリューム情報」にループが到達したため、例外 [UnauthorizedAccessException] が発生し、プログラムが停止します。この例外をスキップして、システム ボリューム情報のような保護されたファイルとフォルダーを除くすべてのファイルでコードをループさせる必要があります。

ご不便をおかけして申し訳ありません....

4

1 に答える 1

0
Imports System.IO

Public Class Form1

  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim strFileList(-1) As String
    Call GetAllFiles("C:\", "*.*", strFileList)

    ListBox1.ClearSelected()
    For Each s As String In strFileList
      ListBox1.Items.Add(s)
    Next s
  End Sub

  Public Sub GetAllFiles(folder As String, searchPattern As String, ByRef fileList() As String)
    'First add all files in the current folder
    Dim strFiles(-1) As String
    Try
      strFiles = Directory.GetFiles(folder, searchPattern, SearchOption.TopDirectoryOnly)
    Catch ex As Exception
    End Try
    If strFiles.GetUpperBound(0) >= 0 Then
      Dim intStartIndex As Integer = fileList.GetUpperBound(0) + 1
      ReDim Preserve fileList(fileList.GetUpperBound(0) + strFiles.GetUpperBound(0) + 1)
      For i As Integer = 0 To strFiles.GetUpperBound(0)
        fileList(intStartIndex + i) = strFiles(i)
      Next i
    End If
    'Next go through all folders
    Dim strFolders(-1) As String
    Try
      strFolders = Directory.GetDirectories(folder, "*.*", SearchOption.TopDirectoryOnly)
    Catch ex As Exception
    End Try
    If strFolders.GetUpperBound(0) >= 0 Then
      For Each strFolder As String In strFolders
        Call GetAllFiles(strFolder, searchPattern, fileList)
      Next strFolder
    End If
  End Sub

End Class
于 2012-09-20T02:34:09.003 に答える