Code-Beispiel
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