Sämtliche Auflistungsmöglichkeiten von Dateien oder Ordnern in
einem Ordner, die in Visual Basic zur Verfügung stehen, liefern
leider eine unsortierte Reihenfolge. Das gilt sowohl für die
Dir-Funktion als auch für die Auflistungen des FileSystemObjects
(aus der Microsoft Scripting Runtime).
Mit Hilfe einer Collection, in die Sie die ermittelten Dateien
oder Ordner gleich sortiert einfügen, lässt sich dieses Manko
mildern. Beheben lässt es sich jedoch nicht vollständig und
zufriedenstellend. Denn jede sortierte Auflistung stellt nur eine
Momentaufnahme dar - werden Dateien oder Ordner hinzugefügt oder
gelöscht, stimmt sie nicht mehr.
Eine nach Namen sortierte Liste von per Dir-Funktion ermittelten
Datei- oder Ordner-Namen können Sie ganz einfach mittels der in "Sortierte
Collections" vorgestellten Funktion AddSortedStr
erstellen (ich setze hier einmal voraus, dass Sie wissen, wie Sie
mit der Dir-Funktion umzugehen haben). Zum sortierten Einfügen von
File- oder Folder-Objekten des FileSystemObjects stellen wir Ihnen
hier einige Varianten des gleichen Prinzips vor. Mit der Funktion
AddFileSorted fügen Sie File-Objekte in eine Collection ein, mit
AddFolderSorted dementsprechend Folder-Objekte. Sie können sogar
zunächst File-Objekte und anschließend Folder-Objekte (oder
natürlich auch umgekehrt) in ein und dieselbe Collection einfügen.
File- und Folder-Objekte verfügen gleichermaßen über die
wesentlichen Eigenschaften wie Name, Path, Size usw. Die beiden
Funktionen unterscheiden sich somit auch lediglich im Datentyp des
übergebenen Objekts.
Die Varianten der beiden Funktionen zum Sortieren nach Größe
heißen AddSortedFileBySize bzw. AddSortedFolderBySize. Beim
Einfügen eines Ordners nach Größe sollten Sie allerdings
bedenken, dass bei jedem Zugriff auf seine Size-Eigenschaft seine
Größe jedes Mal aufs Neue ermittelt wird - bei sehr tief
geschachtelten und reichlich gefüllten Ordnern kann das eine
erhebliche Zeit lang dauern.
Zum Sortieren nach Datum gibt es wiederum drei Varianten - zum
Sortieren nach den Datum-Eigenschaften DateCreated, DateLastModified
und DateLastAccessed. Die Variante für DateCreated funktioniert
unter Windows 9x jedoch nicht, da es dort Dateien gibt,
bei denen dieses Datumsmerkmal unbekannt sein kann (etwa von bzw.
unter MS-DOS angelegte Dateien).
Alle Funktionen geben jeweils als Rückgabewert die
Index-Position zurück, an der das Element gerade eingefügt worden
ist. Im optionalen Parameter können Sie festlegen, ob als
Schlüssel zum Einfügen in die Collection der Dateiname
einschließlich Dateierweiterung (Voreinstellung) oder der komplette
Pfad verwendet werden soll.
Hier sehen Sie nun den Code für die File-Varianten zum
sortierten Einfügen nach Name, Size und DateLastModified. Die
übrigen Varianten finden Sie in dem Modul, das Sie zu diesem
Artikel herunterladen können.
Public Enum KeyModeConstants
kmName
kmPath
End Enum
Public Function AddFileSorted(Collection As Collection, _
Item As File, Optional ByVal KeyMode As KeyModeConstants = kmName) _
As Long
Dim nCount As Long
Dim nHigh As Long
Dim nLow As Long
Dim nTest As Long
Dim nKey As String
Select Case KeyMode
Case kmName
nKey = Item.Name
Case kmPath
nKey = Item.Path
End Select
With Collection
nCount = .Count
If nCount Then
If StrComp(Item.Name, .Item(1).Name, vbTextCompare) < 0 Then
.Add Item, nKey, 1
AddFileSorted = 1
ElseIf StrComp(Item.Name, .Item(nCount).Name, vbTextCompare) _
> 0 Then
.Add Item, nKey
AddFileSorted = nCount + 1
Else
nLow = 1
nHigh = nCount
Do
nTest = (nLow + nHigh) \ 2
If nTest = nLow Then
Exit Do
End If
Select Case StrComp(Item.Name, .Item(nTest).Name, _
vbTextCompare)
Case Is < 0
nHigh = nTest
Case 0
Exit Do
Case Is > 0
nLow = nTest
End Select
Loop
If nTest < nCount Then
Do While StrComp(.Item(nTest + 1).Name, Item.Name, _
vbTextCompare) = 0
nTest = nTest + 1
If nTest = nCount Then
Exit Do
End If
Loop
End If
.Add Item, nKey, , nTest
AddFileSorted = nTest + 1
End If
Else
.Add Item, nKey
AddFileSorted = 1
End If
End With
End Function
Public Function AddFileSortedBySize(Collection As Collection, _
Item As File, Optional ByVal KeyMode As KeyModeConstants = kmName) _
As Long
Dim nCount As Long
Dim nHigh As Long
Dim nLow As Long
Dim nTest As Long
Dim nTestItem As Object
Dim nKey As String
Select Case KeyMode
Case kmName
nKey = Item.Name
Case kmPath
nKey = Item.Path
End Select
With Collection
nCount = .Count
If nCount Then
If Item.Size < .Item(1).Size Then
.Add Item, nKey, 1
AddFileSortedBySize = 1
ElseIf Item.Size > .Item(nCount).Size Then
.Add Item, nKey
AddFileSortedBySize = nCount + 1
Else
nLow = 1
nHigh = nCount
Do
nTest = (nLow + nHigh) \ 2
If nTest = nLow Then
Exit Do
End If
Set nTestItem = .Item(nTest)
Select Case Item.Size
Case Is < nTestItem.Size
nHigh = nTest
Case nTestItem.Size
Exit Do
Case Is > nTestItem.Size
nLow = nTest
End Select
Loop
If nTest < nCount Then
Do While .Item(nTest + 1).Size = Item.Size
nTest = nTest + 1
If nTest = nCount Then
Exit Do
End If
Loop
End If
.Add Item, nKey, , nTest
AddFileSortedBySize = nTest + 1
End If
Else
.Add Item, nKey
AddFileSortedBySize = 1
End If
End With
End Function
Public Function AddFileSortedByDateLastModified _
(Collection As Collection, Item As File, _
Optional ByVal KeyMode As KeyModeConstants = kmName) As Long
Dim nCount As Long
Dim nHigh As Long
Dim nLow As Long
Dim nTest As Long
Dim nTestItem As Object
Dim nKey As String
Select Case KeyMode
Case kmName
nKey = Item.Name
Case kmPath
nKey = Item.Path
End Select
With Collection
nCount = .Count
If nCount Then
If Item.DateLastModified < .Item(1).DateLastModified Then
.Add Item, nKey, 1
AddFileSortedByDateLastModified = 1
ElseIf Item.DateLastModified > _
.Item(nCount).DateLastModified Then
.Add Item, nKey
AddFileSortedByDateLastModified = nCount + 1
Else
nLow = 1
nHigh = nCount
Do
nTest = (nLow + nHigh) \ 2
If nTest = nLow Then
Exit Do
End If
Set nTestItem = .Item(nTest)
Select Case Item.DateLastModified
Case Is < nTestItem.DateLastModified
nHigh = nTest
Case nTestItem.DateLastModified
Exit Do
Case Is > nTestItem.DateLastModified
nLow = nTest
End Select
Loop
If nTest < nCount Then
Do While .Item(nTest + 1).DateLastModified = _
Item.DateLastModified
nTest = nTest + 1
If nTest = nCount Then
Exit Do
End If
Loop
End If
.Add Item, nKey, , nTest
AddFileSortedByDateLastModified = nTest + 1
End If
Else
.Add Item, nKey
AddFileSortedByDateLastModified = 1
End If
End With
End Function
|