Order of Files collection in FileSystemObject

霸气de小男生 提交于 2019-11-27 15:45:12
Ekkehard.Horner

If you want to get the files in a folder in a specific order, you'll have to do it yourself. If you don't like the ADO recordset or using a sortable .NET collection, you can shell out (.Run, .Exec) and process the output of dir /A:-D /B /O:D /T:C (no folders, bare format (no header/summary), order:date, timefield:creation).

Update:

While I surely can show examples where the .Files collection delivered its elements ordered by name, Mr. Gates explicitly says:

INFO: Limitations of the FileSystemObject ... Cannot sort file names from the files collection - you can iterate through the File objects in the Files collection to obtain a list of the files in a folder. However, the File objects are not sorted. You need to use a sort routine to sort the File objects in the Files collection.

Minimalistic demo code that shows: You need a shell (%comspec%) if you want to use shell features - like intrinsic commands:

Option Explicit

Dim goFS  : Set goFS = CreateObject("Scripting.FileSystemObject")
Dim goWS  : Set goWS = CreateObject("WScript.Shell")
Dim csDir : csDir = "c:\temp"

WScript.Quit demoSF()

Function demoSF()
  demoSF = 0
  Dim aDSOrd : aDSOrd = getDSOrd(csDir, "%comspec% /c dir /A:-D /B /O:D /T:C """ & csDir & """")
  Dim oFile
  For Each oFile In aDSOrd
      WScript.Echo oFile.DateCreated, oFile.Name
  Next
End Function ' demoSF

Function getDSOrd(sDir, sCmd)
  Dim dicTmp : Set dicTmp = CreateObject("Scripting.Dictionary")
  Dim oExec  : Set oExec  = goWS.Exec(sCmd)
  Do Until oExec.Stdout.AtEndOfStream
     dicTmp(goFS.GetFile(goFS.BuildPath(sDir, oExec.Stdout.ReadLine()))) = Empty
  Loop
  If Not oExec.Stderr.AtEndOfStream Then
     WScript.Echo "Error:", oExec.Stderr.ReadAll()
  End If
  getDSOrd = dicTmp.Keys()
End Function

Output:

cscript 16895525.vbs
07.10.1998 15:31:34 TlbInf32.chm
..
09.10.2008 22:40:29 sqlce.sql
09.10.2008 22:40:29 gltsqlcopytest.sdf
05.11.2008 20:11:39 Vorfuehrung.class
..
28.03.2011 20:23:36 Program.cs
.
01.10.2012 10:10:10 KyXHDe.chm

Is it really too much code to sort?

set fso = CreateObject("Scripting.FileSystemObject")

Set outputLines = CreateObject("System.Collections.ArrayList")
for each f in fso.GetFolder(".").files
  outputLines.Add f.Name
next
outputLines.Sort() ' 5 lines...

For Each outputLine in outputLines
  set file = fso.GetFolder(".").files.item (outputLine&"")
  Wscript.Echo file.name ' TODO: your thing here
Next
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!