In VBScript, I want to get a list of files in a folder ordered by creation date. I saw that in order to do that I will need to either use a record set (seems like an overkill to me) or sort the collection myself (I think I can avoid it and I want my code to be shorter).
Since I am the one creating the files, I create them with names that begin with the date (yyyy_mm_dd) so I though that if I can get the files at least ordered by name then I'm all set. Unfortunately, the MSDN documentation of the Files collection from FileSystemObject doesn't say anything about the order of the collection. Does anyone know of some other secret documentation or something like that that can be more specific?
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