Tipp-Upload: VB.NET 0115: Dateisystem rekursiv enumerieren
von ChristianM
Ü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.
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 |
Verwendete API-Aufrufe: |
Download: |
' 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.