VB.NET-Tipp 0023: Ordner rekursiv nach Dateien durchsuchen
von Herfried Wagner
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: | 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: |
' 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?