The short answer is: Copy all the files into an array and then sort the array.
If all you want to do is sort the files by name, then that is pretty easy to do.
However, if you want to sort the files by size or date created or whatever, then you can't use a simple array. You must use a two-dimensional array, an array of VBScript objects (that is, instances of a VBScript Class that you define), or--my own preference for this particular task--an array of arrays.
The following code is a demonstration page that allows the user to choose the desired sort by clicking in a link at the head of any column. (And clicking the same link twice will reverse the sort!) You might be able to use some variation on this almost unchanged for your own purposes.
<% ' In this demo, at least, we don't allow user to change directories... ' Change the DIRECTORY to point to any virtual directory of your choice. CONST DIRECTORY = "/" ' relative path in virtual directories
' Specify one of these constants for "sortBy"... CONST FILE_NAME = 0 CONST FILE_EXT = 1 CONST FILE_TYPE = 2 CONST FILE_SIZE = 3 CONST FILE_CREATED = 4 CONST FILE_MODIFIED = 5 CONST FILE_ACCESSED = 6
' get requested sort order, if not first time here... ' (forward by name is default) req = Request("sortBy") If Len(req) < 1 Then sortBy = 0 Else sortBy = CInt(req) req = Request("priorSort") If Len(req) < 1 Then priorSort = -1 Else priorSort = CInt(req)
' ' did user ask for same sort? to reverse the order? ' but if so, then zap priorSort so clicking again will do forward! If sortBy = priorSort Then reverse = true priorSort = -1 Else reverse = false priorSort = sortBy End If
' now start the *real* code... ' path = Server.MapPath( DIRECTORY )
Set fso = CreateObject("Scripting.FileSystemObject") Set theCurrentFolder = fso.GetFolder( path ) Set curFiles = theCurrentFolder.Files ' ' And now a loop for the files ' Dim theFiles( ) ReDim theFiles( 500 ) ' arbitrary size! currentSlot = -1 ' start before first slot
' We collect all the info about each file and put it into one ' "slot" in our "theFiles" array. ' For Each fileItem in curFiles fname = fileItem.Name fext = InStrRev( fname, "." ) If fext < 1 Then fext = "" Else fext = Mid(fname,fext+1) ftype = fileItem.Type fsize = fileItem.Size fcreate = fileItem.DateCreated fmod = fileItem.DateLastModified faccess = fileItem.DateLastAccessed currentSlot = currentSlot + 1 If currentSlot > UBound( theFiles ) Then ReDim Preserve theFiles( currentSlot + 99 ) End If ' note that what we put here is an array! theFiles(currentSlot) = Array(fname,fext,ftype,fsize,fcreate,fmod,faccess) Next ' ' files are now in the array... ' ' As noted, it is actually an ARRAY *OF* ARRAYS. Which makes ' picking the column we will sort on easier! ' ' ...size and sort it... fileCount = currentSlot ' actually, count is 1 more, since we start at 0 ReDim Preserve theFiles( currentSlot ) ' really not necessary...just neater!
' First, determine which "kind" of sort we are doing. ' (VarType=8 means "string") ' If VarType( theFiles( 0 )( sortBy ) ) = 8 Then If reverse Then kind = 1 Else kind = 2 ' sorting strings... Else If reverse Then kind = 3 Else kind = 4 ' non-strings (numbers, dates) End If
' ' A simple bubble sort for now...easier to follow the code... ' For i = fileCount TO 0 Step -1 minmax = theFiles( 0 )( sortBy ) minmaxSlot = 0 For j = 1 To i Select Case kind ' which kind of sort are we doing? ' after the "is bigger/smaller" test (as appropriate), ' mark will be true if we need to "remember" this slot... Case 1 ' string, reverse...we do case INsensitive! mark = (strComp( theFiles(j)(sortBy), minmax, vbTextCompare ) < 0) Case 2 ' string, forward...we do case INsensitive! mark = (strComp( theFiles(j)(sortBy), minmax, vbTextCompare ) > 0) Case 3 ' non-string, reverse ... mark = (theFiles( j )( sortBy ) < minmax) Case 4 ' non-string, forward ... mark = (theFiles( j )( sortBy ) > minmax) End Select ' so is the current slot bigger/smaller than the remembered one? If mark Then ' yep, so remember this one instead! minmax = theFiles( j )( sortBy ) minmaxSlot = j End If Next ' is the last slot the min (or max), as it should be? If minmaxSlot <> i Then ' nope...so do the needed swap... temp = theFiles( minmaxSlot ) theFiles( minmaxSlot ) = theFiles( i ) theFiles( i ) = temp End If Next ' Ta-da! The array is sorted! ' %> <FORM Name="doSort" Method="Get"> <INPUT Type=Hidden Name=priorSort Value="<% = priorSort %>"> <INPUT Type=Hidden Name=sortBy Value="-1"> </FORM>
Some of the products that appear on this site are from companies from which QuinStreet receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. QuinStreet does not include all companies or all types of products available in the marketplace.