Rubrik: Dateisystem · Ordner & Verzeichnisse | VB-Versionen: VB2010 - VB2015 | 25.07.22 |
![]() Es wird eine Funktion zur Erstellung einer sortierten Liste von Filenamen gezeigt. Mögliche Sortiermerkmale: LastAccessTime, LastWriteTime, CreationTime der Files. | ||
Autor: ![]() | Bewertung: ![]() ![]() ![]() ![]() ![]() | Views: 3.597 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | kein 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)