Code-Beispiel

Klasse zur Suche im Dateisystem

Autor: Dr. Holger Schwichtenberg

Beschreibung

Die FCL bietet leider keine eingebaute Klasse, um Dateien oder Verzeichnisse zu suchen. Sie haben daher keine andere Möglichkeit, als selbst rekursiv in einem Verzeichnisbaum hinabzusteigen, um eine Datei oder ein Verzeichnis zu finden.

Ihnen wird die nachfolgend dokumentierte Klasse FileSearcher eine große Hilfe sein. FileSearcher sucht rekursiv von einem Startordner ausgehend nach einem oder mehreren Objekten im Dateisystem. Die Methode Search() erwartet im ersten Parameter einen String mit dem Startordner und im zweiten Parameter entweder einen String oder eine ArrayList mit mehreren Strings. Als Strings sind DOS-Suchmuster mit den Platzhaltern ? und * erlaubt.

FileSearcher liefert die Suchergebnisse einerseits in Form einer ArrayList (Liste der vollständigen Pfade der Fundstellen) am Ende der Ausführung zurück. Andererseits feuert die Klasse bei jeder Fundstelle sofort das Ereignis FileFound().

Programmcodebeispiele Visual Basic .NET (VB.NET)

Imports System.IO

' ============================
' .NET-Code-Beispiel in Visual Basic .NET
' Ergebnis einer Suche im Dateisystem
' (C) Holger@Schwichtenberg.de
' ============================
Public Class FileSearchResult
Public name As String
Public size As Long

Sub New()

End Sub

Sub New(ByVal nName As String, _
ByVal nSize As Long)
name = nName
size = nSize
End Sub

Public Overrides Function tostring() As String
tostring = name & " (" & size & ")"
End Function

End Class

' ============================
' .NET-Code-Beispiel in Visual Basic .NET
' Klasse für Suchanfrage im Dateisystem
' (C) Holger@Schwichtenberg.de
' ============================
Public Class FileSearcher

' --- Member
Public Event FileFound( _
ByVal sr As FileSearchResult)

Public Function Search( _
ByVal startdir As String, _
ByVal name As String) As ArrayList

Dim ergebnis As New ArrayList()
Dim names As New ArrayList()
names.Add(name)
Search(startdir, names, ergebnis)
Search = ergebnis
End Function

Public Function Search( _
ByVal startdir As String, _
ByVal names As ArrayList) As ArrayList

Dim ergebnis As New ArrayList()
_Search(startdir, names, ergebnis)
Search = ergebnis
End Function

' --- Interne Routinen
Private Sub Search(
ByVal startdir As String, _
ByVal names As ArrayList, _
ByVal ergebnis As ArrayList)

Dim d As New DirectoryInfo(startdir)
Dim f As FileInfo
Dim sd As DirectoryInfo
Dim sr As FileSearchResult
Dim name As String
'out("Suche in: " & startdir)

Try
For Each name In names

For Each f In d.GetFiles(name)
sr = New FileSearchResult( _
f.FullName, f.Length)
RaiseEvent FileFound(sr)
ergebnis.Add(sr)
Next
For Each sd In d.GetDirectories(name)
sr = New FileSearchResult( _
sd.FullName, 0)
RaiseEvent FileFound(sr)
ergebnis.Add(sr)
Next
Next
' --- Rekursion
For Each sd In d.GetDirectories()
_Search(sd.FullName, names, ergebnis)
Next
Catch
End Try

End Sub

End Class

Programmcodebeispiele CSharp (C#)

using System;
using System.Collections;
using System.IO;

namespace FCLBuch._SystemIO {

// Delegate für Found-Event
public delegate void FeFileFoundEventHandler(object sender, FileFoundEventArgs e);

public class FileSearcher {

// Event
public event FeFileFoundEventHandler FileFound;

public ArrayList Search(string startFolder, string name) {

ArrayList names = new ArrayList();
names.Add(name);
return Search(startFolder, names);
}

public ArrayList Search(string startFolder, ArrayList names) {

return InternalSearch(new DirectoryInfo(startFolder), names);
}

public void OnFileFound(FileFoundEventArgs e) {

if ( this.FileFound != null)
FileFound(this, e);
}

private ArrayList InternalSearch(DirectoryInfo dirInfo, ArrayList names) {

ArrayList result = new ArrayList();

foreach (string name in names) {
foreach(FileInfo fi in dirInfo.GetFiles(name)) {
result.Add(fi);
OnFileFound(new FileFoundEventArgs(fi.Name, fi.Length));
}
}

foreach(DirectoryInfo di in dirInfo.GetDirectories())
result.AddRange(InternalSearch(di, names));

return result;
}

public FileSearcher() { }
}
}

Hinweise

Ausgaben werden in den Beispielen durch Hilfsroutinen wie out() und PrintOut() erzeugt. Diese sind hier nicht angegeben, da deren Implementierung von der jeweiligen Umgebung abhängt. Für Konsolenanwendungen können hier z.B. Console.WriteLine() einsetzen.


 

Querverweise

 Liste aller Codebeispiele  Definition '.NET Framework Class Library'  .NET & Visual Studio Community Portal

Buchtipp

Buchcover PowerShell 7 und Windows PowerShell 5 – das Praxishandbuch (5. Auflage Oktober 2022 (9. Auflage Gesamtreihe)) PowerShell 7 und Windows PowerShell 5 – das Praxishandbuch
Autor(en): Dr. Holger Schwichtenberg
Erschienen 2022
Umfang: 1426 Seiten
ISBN: 3446472967

Beratung & Support

Schulungen zu diesem Thema

  Anfrage für eine individuelle Schulung zum Thema VISUAL BASIC C#   Gesamter Schulungsthemenkatalog

Bücher zu diesem Thema

  Alle unsere aktuellen Fachbücher   E-Book-Abo für ab 99 Euro im Jahr