指定フォルダ内のファイル名を、様々な順番で取得(失敗談)

先日は、指定フォルダ内にある「一番最後に更新されたファイル」を取得してみた。
infoment.hatenablog.com
ふと思った。他にも色々な順序で取得出来たら、便利かもしれない。
f:id:Infoment:20190209101214p:plain

そこで、考えてみた。

  1. 指定したプロパティ、例えば名前やファイルサイズをkeyに、ファイル名をitemとして辞書に登録する。
  2. keysを配列に受け取り、ソートする。
  3. ソートした結果でitemを受け取り、リストとして返す。

ここまで読んで、「ああ・・・」と思った方、お察しの通りです。
取り敢えず、作ってみた。

リスト作成用
Option Explicit

Enum SortType
    date_created
    date_last_accessed
    date_last_modified
    file_name
    file_size
    file_type
End Enum

Enum SortOrder
    ascending_order
    descending_order
End Enum
    

Function GetFileList(folder_path As String, _
                     Optional sort_type As SortType = file_name, _
                     Optional sort_order As SortOrder = ascending_order) _
                     As Variant

    Dim FSO As FileSystemObject
    Set FSO = New FileSystemObject
    
    Dim Dict As Dictionary
    Set Dict = New Dictionary
    
    Dim FilesCollection As Files
    Set FilesCollection = FSO.GetFolder(folder_path).Files
    
    Dim File As File
        For Each File In FilesCollection
            Select Case sort_type
                Case date_created: Dict(File.DateCreated) = File.Path
                Case date_last_accessed: Dict(File.DateLastAccessed) = File.Path
                Case date_last_modified: Dict(File.DateLastModified) = File.Path
                Case file_name: Dict(File.Name) = File.Path
                Case file_size: Dict(File.Size) = File.Path
                Case file_type: Dict(File.Type) = File.Path
            End Select
        Next
        
    Dim SortSeq As Variant
        SortSeq = Dict.Keys
        SortSeq = GetSortSeq(SortSeq, sort_order)
    
    Dim i As Long
    Dim TempSeq As Variant
    ReDim TempSeq(UBound(SortSeq))
        For i = 0 To UBound(SortSeq)
            TempSeq(i) = Dict(SortSeq(i))
        Next

        GetFileList = TempSeq
End Function
配列ソート用
Public Function GetSortSeq(seq As Variant, _
                        Optional sort_order As SortOrder = ascending_order) As Variant

    Dim aryList As Object
    Dim s As Variant

    Set aryList = CreateObject("System.Collections.ArrayList")
    
    For Each s In seq
        Call aryList.Add(s)
    Next
    
    Select Case sort_order
        Case ascending_order
            Call aryList.Sort
        Case descending_order
            Call aryList.Sort
            Call aryList.Reverse
    End Select
    
    GetSortSeq = aryList.ToArray
    
End Function
テスト用
Sub test()
    Dim seq As Variant
        seq = GetFileList("C:\Temp", file_name)
        
        Range("A2").Resize(UBound(seq) + 1) = WorksheetFunction.Transpose(seq)
End Sub

名前での取得、上手くいった。
f:id:Infoment:20190209102108p:plain

では、ファイルサイズでは?
f:id:Infoment:20190209102203p:plain

あれ?一個しか出てこない・・・あ、そうか!ファイルサイズが同じなら、辞書(連想配列)の性質上、全て上書きされて一つしか残らないんだった。うっかりが過ぎた、大失敗。

というわけで、考え直しです。

今日のは・・・参考になりません。