指定フォルダ内のファイル名を、様々な順番で取得(失敗談)
先日は、指定フォルダ内にある「一番最後に更新されたファイル」を取得してみた。
infoment.hatenablog.com
ふと思った。他にも色々な順序で取得出来たら、便利かもしれない。
そこで、考えてみた。
- 指定したプロパティ、例えば名前やファイルサイズをkeyに、ファイル名をitemとして辞書に登録する。
- keysを配列に受け取り、ソートする。
- ソートした結果で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
名前での取得、上手くいった。
では、ファイルサイズでは?
あれ?一個しか出てこない・・・あ、そうか!ファイルサイズが同じなら、辞書(連想配列)の性質上、全て上書きされて一つしか残らないんだった。うっかりが過ぎた、大失敗。
というわけで、考え直しです。
今日のは・・・参考になりません。