FileSystemObjectによるファイル取り出しの順序

FileSystemObjectによるファイル取り出しの順序

おなじみ、OFFICE TANAKAのコチラのページによると、「Dir関数が返すファイルの順番」は、

ディスクのフォーマットによって異なります。最近主流のNTFSでフォーマットされているディスクでは、ファイルが保存された順番(タイムスタンプ)にかかわらず、ファイル名の順番(昇順)で返ります。

ということらしい。また、

FATと呼ばれる形式でフォーマットでされたディスクでは、ファイル名の順番ではなく、ディスクに保存された順番で返ります。

とも。

では、FileSystemObjectFilesコレクションをFor ~ Eachで回した場合はどうなるのか。

やってみた。

準備

まずは、Sampleというフォルダを作り、その中にテキストファイルを作った。

f:id:akashi_keirin:20190908204830j:plain

で、そのSampleフォルダを、フラッシュメモリFAT32)上とHDD(NTFS)上に置いた。

ファイルを取り出す

ファイルを取り出して、ファイル名を書き出すコードを次のように書いた。

リスト1 標準モジュール
Private Sub printFilenames(ByVal tgtDir As String)
  If fsObj Is Nothing Then _
    Set fsObj = New FileSystemObject
  Dim tgtFolder As Folder
  Set tgtFolder = fsObj.GetFolder(tgtDir)
  Dim txtFiles As Collection
  Set txtFiles = New Collection
  Dim txtFile As File
  For Each txtFile In tgtFolder.Files
    Call txtFiles.Add(txtFile)
  Next
  Dim i As Long
  For i = 1 To txtFiles.Count
    Debug.Print txtFiles(i).Name
  Next
End Sub

変数fsObjはモジュールレベルで宣言してある。

で、これを次のコードで呼び出して実行する。

スト2 標準モジュール
Private Sub testPrintFilenames()
  Dim tgtDir As String
  'フラッシュメモリFAT32)上のフォルダ'
  tgtDir = ThisWorkbook.Path & "\Sample\"
  Debug.Print "### FAT32からのファイル名取り出し ###"
  Call printFilenames(tgtDir)
  'HDD(NTFS)上のフォルダ'
  tgtDir = "D:\Sample\"
  Debug.Print "### NTFSからのファイル名取り出し ###"
  Call printFilenames(tgtDir)
End Sub

実行結果

f:id:akashi_keirin:20190908204837j:plain

f:id:akashi_keirin:20190908204841j:plain

ご覧の通り。

おわりに

確かに、ファイルシステムによって取り出し順は異なるようだ。