vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 
zurück
Rubrik: Dateisystem · Ordner & Verzeichnisse   |   VB-Versionen: VB2010 - VB201525.07.22
Sortieren von File-Listen nach Zeit-Daten

Es wird eine Funktion zur Erstellung einer sortierten Liste von Filenamen gezeigt. Mögliche Sortiermerkmale: LastAccessTime, LastWriteTime, CreationTime der Files.

Autor:   Dietrich HerrmannBewertung:     [ Jetzt bewerten ]Views:  200 
ohne HomepageSystem:  Vista, Win7, Win8, Win10kein Beispielprojekt 

Wenn man Zugriff auf eine Liste von Files haben will, entnommen bspw. aus einem Ordner und eventuell noch mittels Extension-Filter, erzeugt man zunächst eine Liste der entsprechenden Filenamen in einem Array. Das Array ist der Ausgangspunkt für das Sortieren der Filenamen in Bezug auf eine der Zeitangaben zum File wie LastAccessTime, LastWriteTime, CreationTime. Das Array liegt dann nach Anwendung der Funktion in sortierter Form vor.

Ich stelle dazu auch eine Funktion zur Ermittlung der ursprünglichen File-Namenliste zur Verfügung:

Hier die Funktion GetFiles:

''' <summary>
''' 	finden von Dateien rekursiv
''' </summary>
''' <param name="path">der zu durchsuchende Pfad</param>
''' <param name="searchPattern">der File-Filter nach Extension</param>
''' <param name="inclPath">suchen auch in Unterordnern</param>
''' <param name="uCase">die Filenamen nur als Großbuchstaben</param>
''' <returns>die String-Liste der Filenamen</returns>
Public Function MyGetFiles(path As String,
  searchPattern As String,
  Optional inclPath As Boolean = True,
  Optional uCase As Boolean = False) As List(Of String)
 
  ' Aufruf
  ' Dim files As List(Of String)
  ' files = MyGetFiles("C:", "*.txt")
  Dim a As New List(Of String)
  Try
    ' finde Files
    Dim files() As String
    files = Directory.GetFiles(path, searchPattern)
    For Each file As String In files
      If uCase Then file = file.ToUpper()
      a.Add(file)
    Next 
  Catch ex As Exception
  End Try
 
  Try
    ' durchsuche Unterordner
    Dim subfolders() As String, b As New List(Of String)
    subfolders = Directory.GetDirectories(path)
    ' durchsuchen von Unterordnern mit rekursivem Aufruf
    For Each subfolder As String In subfolders
      a.AddRange(MyGetFiles(subfolder, searchPattern))
    Next
  Catch ex As Exception
  End Try
 
  If Not inclPath Then
    Dim i, idx As Short, t As String
    For i = 0 To a.Count - 1
      t = a(i)
      idx = t.LastIndexOf("") + 1
      t = t.Substring(idx)
      a(i) = t
      ' i += 1
    Next
  End If
  ' return die gefundenen Files
  Return a
End Function

Beispiel des Aufrufs:

Dim bakFiles() as String = GetFiles(bakPfad, "*.bak").ToArray

wobei bakPfad den Ordner bezeichnet, der *.bak-Files enthält

Danach wird das Sortieren aufgerufen.
Für die Funktion wird zunächst eine Enumeration benötigt:

Hier jetzt der Code der Funktion SortFilesByDate:

''' <summary>
''' Enumeration der Datei-Zeiten
''' </summary>
  Public Enum EnumFileAttributes As Integer
    LastAccessTime
    LastWriteTime
    CreationTime
End Enum
''' <summary>
''' Sortierung einer Datei-Namenliste, 
''' wo die Namen mit komplettem Pfad in einem Array angegeben werden,
''' nach einer von 3 verschiedenen Zeitangaben.
''' Die Zeiten LastAccessTime, LastWriteTime und CreationTime stehen zur Verfügung.
''' Das Array wird nach einer von diesen 3 Zeiten sortiert.
''' </summary>
''' <param name="theFileArray">das zu sortierende Array mit den kompletten Pfaden der zu sortierenden Dateien</param>
''' <param name="theTime">die Zeit, nach der sortiert werden soll</param>
''' <param name="doReverse">soll das Array nach der Sortierung umgekehrt werden, true|false</param>
''' <param name="delPath">sollen im Array die Pfade beseitigt werden, true|false</param>
Public Sub SortFilesByDate(theFileArray() As String, theTime As EnumFileAttributes,
  Optional doReverse As Boolean = False,
  Optional delPath As Boolean = False)
 
  Dim ArrLen As Short = theFileArray.Length - 1
  Dim tmpValue, sp() As String, i As Short, flag As Boolean
 
  Select Case theTime
    Case EnumFileAttributes.CreationTime
      Do
        flag = True
        For i = 0 To ArrLen - 1
          If File.GetCreationTime(theFileArray(i)) _
            > File.GetCreationTime(theFileArray(i + 1)) Then
            TmpValue = theFileArray(i)
            theFileArray(i) = theFileArray(i + 1)
            theFileArray(i + 1) = TmpValue
            flag = False
          End If
        Next i
      Loop Until flag
    Case EnumFileAttributes.LastAccessTime
      Do
        flag = True
        For i = 0 To ArrLen - 1
          If File.GetLastAccessTime(theFileArray(i)) _
            > File.GetLastAccessTime(theFileArray(i + 1)) Then
            TmpValue = theFileArray(i)
            theFileArray(i) = theFileArray(i + 1)
            theFileArray(i + 1) = TmpValue
            flag = False
          End If
        Next i
      Loop Until flag
    Case EnumFileAttributes.LastWriteTime
      Do
        flag = True
        For i = 0 To ArrLen - 1
          If File.GetLastWriteTime(theFileArray(i)) _
            > File.GetLastWriteTime(theFileArray(i + 1)) Then
            TmpValue = theFileArray(i)
            theFileArray(i) = theFileArray(i + 1)
            theFileArray(i + 1) = TmpValue
            flag = False
          End If
        Next i
      Loop Until flag
  End Select
 
  If delPath Then    ' Pfade löschen
    For i = 0 To ArrLen
      sp = Split(theFileArray(i), "")
      theFileArray(i) = sp(sp.Length - 1)
    Next
  End If
  If doReverse Then Array.Reverse(theFileArray)   ' Feld umkehren
End Sub

Beispiel des Aufrufs:

SortFilesByDate(bakFiles, EnumFileAttributes.LastWriteTime, True, True)

Dieser Tipp wurde bereits 200 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen [email protected]  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren [email protected]!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2022 [email protected] Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel