Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0115: Dateisystem rekursiv enumerieren

 von 

Über den Tipp  

Dieser Vorschlag soll VB.NET Tipp 0023 ersetzen.

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Dateien und Laufwerke

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
Dateisystem enumerieren, Rekursion

Der Vorschlag wurde erstellt am: 27.09.2007 16:08.
Die letzte Aktualisierung erfolgte am 15.06.2008 16:27.

Zurück zur Übersicht

Beschreibung  

Hallo!

Für die Beschreibung des Tipps, siehe hier:  VB.NET Tipp 23

Ich habe den Tipp übernommen und leicht erweitert. Nur diese Erweiterungen stammen von mir.

Hinzugekommen: Sie können auswählen, ob sie nur Dateien, nur Ordner oder beides enummerieren wollen. Außerdem werden aufgetretene Fehler über ein Ereigniss weitergeleitet.

Viel Spaß

Christian

Schwierigkeitsgrad

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [10,67 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' -------- Anfang Projektdatei FileEnumerator.vbproj  --------
' ----------- Anfang Datei FileSystemEnumerator.vb -----------
Option Explicit On
Option Strict On
Option Compare Binary

Imports System.IO

''' <remarks>
''' Eine einfache Klasse zum rekursiven
''' Enumerieren von Dateien und bzw. oder
''' Ordnern in einem Dateisystem.
''' </remarks>
Public Class FileSystemEnumerator

    Private m_StartDirectory As DirectoryInfo
    Private m_EnumerationStatus As EnumerationType = EnumerationType.Both

    Public Enum EnumerationType As Integer
        OnlyDirs = 1
        OnlyFiles = 2
        Both = 0
    End Enum

    ''' <summary>
    ''' Wird ausgelöst, wenn eine Datei gefunden wird.
    ''' </summary>
    ''' <param name="File">Gefundene Datei.</param>
    Public Event FileFound(ByVal File As IO.FileInfo)

    ''' <summary>
    ''' Wird ausgelöst, wenn ein Ordner gefunden wird.
    ''' </summary>
    ''' <param name="Directory">Gefundener Ordner.</param>
    ''' <param name="ContinueRecursion">
    ''' Boolescher Parameter, in dem angebenen wird,
    ''' ob die rekursive Enumeration fortgesetzt
    ''' werden soll.
    ''' </param>
    Public Event DirectoryFound(ByVal Directory As IO.DirectoryInfo, ByRef ContinueRecursion _
        As Boolean)

    ''' <summary>
    ''' Wird ausgelöst, wenn der Zufriff auf das Dateisystem
    ''' verweigert wurde und ein andere Fehler auftrat.
    ''' </summary>
    ''' <param name="ex">Fehler</param>
    Public Event ErrorOccoured(ByVal ex As Exception)

    ''' <summary>
    ''' Gibt den Ordner, in dem die Enumeration
    ''' gestartet werden soll, an oder gibt ihn
    ''' zurück.
    ''' </summary>
    ''' <value>Ordner, in dem die Enumeration
    ''' gestartet werden soll.</value>
    Public Property StartDirectory() As DirectoryInfo
        Get
            Return m_StartDirectory

        End Get

        Set(ByVal Value As DirectoryInfo)

            If Value.Exists Then
                m_StartDirectory = Value

            Else

                Throw New DirectoryNotFoundException
            End If

        End Set

    End Property

    ''' <summary>
    ''' Gibt den Enueration-Status an oder gibt ihn
    ''' zurück.
    ''' </summary>
    ''' <value>Status mit dem die Enumeration
    ''' arbeitet.</value>
    Public Property EnumerationStatus() As EnumerationType
        Get
            Return m_EnumerationStatus

        End Get

        Set(ByVal value As EnumerationType)
            m_EnumerationStatus = value

        End Set

    End Property

    ''' <summary>
    ''' Startet die Enumeration der Objekte in
    ''' der Eigenschaft <c>StartDirectory</c>
    ''' angegebenen Ordner.
    ''' </summary>
    Public Sub Enumerate()

        If m_StartDirectory.Exists Then
            CheckDirectory(m_StartDirectory)

        Else

            Throw New DirectoryNotFoundException
        End If

    End Sub

    ''' <summary>
    ''' Startet die Enumeration aller Dateien, die
    ''' direkt im Ordner liegen und geht dann
    ''' alle Ordner, die direkt in einem Ordner
    ''' liegen, durch und löst für jeden Ordner
    ''' das Ereignis DirectoryFound aus. Dann wird
    ''' ggf. die Enumeration rekursiv auf enthaltene
    ''' Ordner fortgesetzt.
    ''' </summary>
    ''' <param name="Dir">Ordner, dessen
    ''' Inhalt enumeriert werden soll.</param>
    Private Sub CheckDirectory(ByVal Dir As IO.DirectoryInfo)

        If m_EnumerationStatus <> EnumerationType.OnlyDirs Then
            CheckFiles(Dir)
        End If

        Dim di As IO.DirectoryInfo

        Try

            For Each di In Dir.GetDirectories

                Dim b As Boolean = True

                If m_EnumerationStatus <> EnumerationType.OnlyFiles Then
                    RaiseEvent DirectoryFound(di, b)
                End If

                If b Then
                    CheckDirectory(di)
                End If

            Next di

        Catch ex As Exception

            RaiseEvent ErrorOccoured(ex)

        End Try

    End Sub

    ''' <summary>
    ''' Geht alle Dateien, die direkt in
    ''' einem Ordner liegen, durch und löst für jede
    ''' Datei das Ereignis FileFound aus.
    ''' </summary>
    ''' <param name="Dir">Ordner, dessen Dateien
    ''' enumeriert werden sollen.</param>
    Private Sub CheckFiles(ByVal Dir As IO.DirectoryInfo)

        Dim fi As IO.FileInfo

        Try

            For Each fi In Dir.GetFiles
                RaiseEvent FileFound(fi)
            Next fi

        Catch ex As Exception

            RaiseEvent ErrorOccoured(ex)

        End Try

    End Sub

End Class

' ------------ Ende Datei FileSystemEnumerator.vb ------------
' ------------------- Anfang Datei Test.vb -------------------
Module Test

    Sub Main()

        Dim Enumerator As New FileSystemEnumerator

        AddHandler Enumerator.FileFound, AddressOf File
        AddHandler Enumerator.DirectoryFound, AddressOf Directory
        AddHandler Enumerator.ErrorOccoured, AddressOf [Error]

        With Enumerator
            .StartDirectory = New IO.DirectoryInfo("C:\Windows")
            .EnumerationStatus = FileSystemEnumerator.EnumerationType.OnlyFiles
            .Enumerate()

            ' Listet alle Dateien im Verzeichniss C:\Windows und sämtlichen
            ' Unterordnern auf.
        End With

        With Enumerator
            .StartDirectory = New IO.DirectoryInfo("C:\Programme")
            .EnumerationStatus = FileSystemEnumerator.EnumerationType.OnlyDirs
            .Enumerate()

            ' Listet alle Ordner im Verzeichniss C:\Programme auf
            ' und verarbeitet dann die Unterordner dieser Ordner ...
        End With

        With Enumerator
            .StartDirectory = New IO.DirectoryInfo("D:\Daten")
            .EnumerationStatus = FileSystemEnumerator.EnumerationType.Both
            .Enumerate()

            ' Listet alle Ordner und Dateien im Verzeichniss D:\Daten
            ' und sämtlichen Unterordnern auf.
        End With

    End Sub

    Private Sub File(ByVal File As IO.FileInfo)

        Console.WriteLine("Gefunde Datei: {0}", File.FullName)

    End Sub

    Private Sub Directory(ByVal Directory As IO.DirectoryInfo, _
          ByRef ContinueRecursion As Boolean)

        Console.WriteLine("Gefunder Ordner: {0}", Directory.FullName)

        ' Um die Unterordner von C:\Windows\System32 auszuschließen:
        If Directory.FullName.StartsWith("C:\Windows\System32") Then
            ContinueRecursion = False
        End If

    End Sub

    Private Sub [Error](ByVal ex As Exception)

        Console.WriteLine("Fehler: {0}", ex.Message)

    End Sub

End Module

' -------------------- Ende Datei Test.vb --------------------
' --------- Ende Projektdatei FileEnumerator.vbproj  ---------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.
Folgende Diskussionen existieren bereits

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.