Sie sind hier: Startseite
 Liste aller Codebeispiele

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() { }
}
}

Querverweise

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