FileSystemObjectによるファイル取り出しの順序
FileSystemObjectによるファイル取り出しの順序
おなじみ、OFFICE TANAKAのコチラのページによると、「
」は、Dir
関数が返すファイルの順番
ディスクのフォーマットによって異なります。最近主流のNTFSでフォーマットされているディスクでは、ファイルが保存された順番(タイムスタンプ)にかかわらず、ファイル名の順番(昇順)で返ります。
ということらしい。また、
FATと呼ばれる形式でフォーマットでされたディスクでは、ファイル名の順番ではなく、ディスクに保存された順番で返ります。
とも。
では、FileSystemObject
のFiles
コレクションをFor ~ Each
で回した場合はどうなるのか。
やってみた。
準備
まずは、Sample
というフォルダを作り、その中にテキストファイルを作った。
で、その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
実行結果
ご覧の通り。
おわりに
確かに、ファイルシステムによって取り出し順は異なるようだ。