Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0023: Ordner rekursiv nach Dateien durchsuchen

 von 

Beschreibung

Dieses Beispiel zeigt eine einfache Funktion Ordner rekursiv nach Dateien zu durchsuchen.

Zu diesem Tipp existieren im Tippupload die folgende(n) Aktualisierung(en):
[VB .NET Tippvorschlag 0115] Dateisystem rekursiv enumerieren

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Framework-Version(en):

.NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [2,49 KB]

' Dieser Quellcode 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!

' Projektversion:   Visual Studio 2002/2003
' Option Strict:    An
' Option Explicit:  An
'
' Referenzen: 
'  - System
'

' ##############################################################################
' ########################## FileSystemEnumerator.vb ###########################
' ##############################################################################
Option Explicit On 
Option Strict On
Option Compare Binary

Imports System.IO

' <remarks>
'   Eine einfache Klasse zum rekursiven 
'   Enumerieren von Dateien und Ordnern in
'   einem Dateisystem.
' </remarks>
Public Class FileSystemEnumerator
    Private m_StartDirectory As DirectoryInfo

    ' <summary>
    '   Wird ausgelöst, wenn eine Datei gefunden wird.
    ' </summary>
    ' <param name="File">Gefundene Datei.</param>
    Public Event FileFound(ByVal File As 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 DirectoryInfo, _
      ByRef ContinueRecursion As Boolean)

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

    ' <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)
            m_StartDirectory = Value
        End Set
    End Property

    ' <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="Directory">Ordner, dessen 
    '   Inhalt enumeriert werden soll.</param>
    Private Sub CheckDirectory( _
      ByVal Directory As DirectoryInfo)
        CheckFiles(Directory)
        Dim di As DirectoryInfo
        For Each di In Directory.GetDirectories()
            Dim b As Boolean = True
            RaiseEvent DirectoryFound(di, b)
            If b Then
                CheckDirectory(di)
            End If
        Next di
    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="Directory">Ordner, dessen Dateien 
    '   enumeriert werden sollen.</param>
    Private Sub CheckFiles( _
      ByVal Directory As DirectoryInfo)
        Dim fi As FileInfo
        For Each fi In Directory.GetFiles()
            RaiseEvent FileFound(fi)
        Next fi
    End Sub
End Class
' ##############################################################################
' ################################## Main.vb ###################################
' ##############################################################################
Option Explicit On 
Option Strict On
Option Compare Binary

Imports System
Imports System.IO

' <remarks>
'   Stellt den Einsprungspunkt der Anwendung bereit.
' </remarks>
Public Class Main
    Private Shared m_Enumerator As FileSystemEnumerator

    ' <summary>
    '   Der Einsprungspunkt der Anwendung.
    ' </summary>
    Public Shared Sub Main()
        Dim m_Enumerator As FileSystemEnumerator = New FileSystemEnumerator()
        m_Enumerator.StartDirectory = New DirectoryInfo("C:\")
        AddHandler m_Enumerator.DirectoryFound, _
          AddressOf Enumerator_DirectoryFound
        AddHandler m_Enumerator.FileFound, _
          AddressOf Enumerator_FileFound
        Console.WriteLine("Suche Dateien mit Endung " & _
          ".exe in ""C:\"", die nicht in ""C:\WINDOWS"" liegen...")
        m_Enumerator.Enumerate()
        RemoveHandler m_Enumerator.DirectoryFound, _
          AddressOf Enumerator_DirectoryFound
        RemoveHandler m_Enumerator.FileFound, _
          AddressOf Enumerator_FileFound
    End Sub

    Private Shared Sub Enumerator_DirectoryFound( _
      ByVal Directory As DirectoryInfo, _
      ByRef ContinueRecursion As Boolean)
        ContinueRecursion = (Directory.FullName <> "C:\WINDOWS")
    End Sub

    Private Shared Sub Enumerator_FileFound( _
      ByVal File As System.IO.FileInfo)
        Try
            If File.Extension = ".exe" Then
                Console.WriteLine(File.FullName)
                Console.Out.Flush()
            End If
        Catch
        End Try
    End Sub
End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 3 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von timo am 10.09.2008 um 19:49

ok, nun der fehler: Der Zugriff auf den Pfad C:\System Volume Information wurde verweigert. in CheckFiles.

Private Sub CheckFiles(ByVal Directory As DirectoryInfo)
Dim fi As FileInfo
Try 'Try nötig um Dateien die gerade nicht zugegriffen werden können ohne Absturz zu umgehen
For Each fi In Directory.GetFiles()
RaiseEvent FileFound(fi)
Next fi
Catch ex As Exception
End Try
End Sub
.

Kommentar von timo am 10.09.2008 um 19:40

super. ich habe etwas mühe den code zu lesen weil ich selten so viele Zeilenumbrüche mit _ fortfahre. das erste GetFiles von C:\ ging bei mir blockierte 5 minuten.
geht aber mit .NET mitteln nicht besser. der tipp ist super.

gruss

timo

Kommentar von Ahlers am 21.06.2004 um 00:45

Schon ein bischen abenteuerlich, das ganze Laufwerk C durchsuchen zu wollen - hat mal jemand probiert, wie lang das dauert?