Patternabfrage über Liste

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Patternabfrage über Liste

    Hallo Zusammen,
    ich hoffe, ich poste diesmal richtig.
    Ich habe jetzt viel gesucht aber nichts Richtiges gefunden.
    Ich habe ein For Each:

    For Each sFile in My.Computer.FileSystem.GetFiles( _
    sPath, FileIO.SearchOption.SearchAllSubDirectories, "*.*")


    Jetzt möchte ich aber gerne alle Dateien mit der Extension *.jpg, *.bmp, usw.
    ausgegeben haben. Gibt es da einen Befehl bzw. wie kann man diese Abfrage gestalten.

    Gruß Stefan
    Benutz lieber den IO-Namespace (System.IO importieren)

    VB.NET-Quellcode

    1. For Each sFile in Directory.EnumerateFiles(_sPath, "*.jpg", SearchOption.AllDirectories) 'Oder anstatt *.jpg -> *.bmp

    Oder du suchst nach allen Dateien und filterst z.B. mit LINQ alle Pfade mit ner jüg oder bmp Endung raus.
    Das geht so nicht, jede Abfrage gestattet nur ein Pattern.
    Sammle also die Infos zu Deinen Pattern nacheinander auf.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    schau' dir mal folgendes an:

    VB.NET-Quellcode

    1. Shared Function FindFiles(ByVal directory As System.IO.DirectoryInfo) As IEnumerable(Of System.IO.FileInfo)
    2. Return directory.EnumerateFiles().Concat(directory.EnumerateDirectories().SelectMany(AddressOf FindFiles))
    3. End Function
    4. Shared Function FindFiles(ByVal directory As System.IO.DirectoryInfo, ByVal filter As Func(Of System.IO.FileInfo, Boolean)) As IEnumerable(Of System.IO.FileInfo)
    5. Return directory.EnumerateFiles().Where(filter).Concat(directory.EnumerateDirectories().SelectMany(Function(dir) FindFiles(dir, filter)))
    6. End Function

    Die 1. Funktion enumeriert alle Dateien im angegebenen Ordner, die 2. Filtert nach der in filter angegebenen Funktion. Folgender Aufruf enumeriert zum Beispiel nach Extensions:

    VB.NET-Quellcode

    1. Shared Function FindFilesByExtension(ByVal directoryPath As String, ByVal ParamArray extensions() As String) As IEnumerable(Of System.IO.FileInfo)
    2. Return FindFilesByExtension(New System.IO.DirectoryInfo(directoryPath), extensions)
    3. End Function
    4. Shared Function FindFilesByExtension(ByVal directory As System.IO.DirectoryInfo, ByVal ParamArray extensions() As String) As IEnumerable(Of System.IO.FileInfo)
    5. Dim upperExt(extensions.Length - 1) As String
    6. For i As Integer = 0 To extensions.Length - 1
    7. upperExt(i) = extensions(i).ToUpper()
    8. Next
    9. Return FindFiles(directory, Function(f) upperExt.Contains(f.Extension.ToUpper()))
    10. End Functiont

    Aufruf:

    VB.NET-Quellcode

    1. For Each f As IO.FileInfo In FindFilesByExtension(Application.StartupPath, ".exe", ".dll")
    2. MessageBox.Show(f.FullName)
    3. Next


    Wenn du Wildcards verwenden möchtest, könntest du das folgendermaßen erreichen:

    VB.NET-Quellcode

    1. Shared Function FindFilesByWildcard(ByVal directory As System.IO.DirectoryInfo, ByVal ParamArray wildcards() As String) As IEnumerable(Of System.IO.FileInfo)
    2. Return FindFiles(directory, Function(f) wildcards.Any(Function(wildcard) f.FullName Like wildcard))
    3. End Function

    Der Aufruf ist identisch zur FindFilesByExtension-Methode, nur dass du dann eben direkt das Pattern angeben kannst.

    Gruß
    ~blaze~