Et spørgsmål som jeg håber I kan svare mig på. Jeg skal lave et lille nemt galleri på min hjemmeside, men når jeg får filerne "printet" på siden via. filesystemobject (getFolder) så viser den det ikke i tal-rækkefølge (heller ikke alfabetisk).
Jeg kan ikke gennemskue hvad den sorterer efter.
Jeg er ikke så stærk i ASP, men vil meget gerne have styr på dette hurtigst muligt.
Den sorterer sådan, som filerne ligger i mappen på serveren. Der er desværre ingen indbygget sorteringsfunktion knyttet til FileSystemObject, så du må lægge alle navnene i et array og så sortere på det.
jeg har denne - faktisk lidt smart - men prøv selv at kigge på den - læg filen i mappen med dine billeder f.eks.
<% ' 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)
' 'priorSort = 1 'her kan du så sætte det tal på fast som du ønsker den skal sortere efter
' 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>
<SCRIPT Language="JavaScript"> function reSort( which ) { document.doSort.sortBy.value = which; document.doSort.submit( ); } </SCRIPT>
<CENTER> <FONT Size="+2"> Showing <% = (fileCount+1) %> files from directory <% = path %> </FONT> <P> Click on a column heading to sort by that column. Click the same column again to reverse the sort. <P> <TABLE Border=1 CellPadding=3> <TR> <TH><A HREF="java script:reSort(0);">File name</A></TH> <TH><A HREF="java script:reSort(1);">Extension</A></TH> <TH><A HREF="java script:reSort(2);">Type</A></TH> <TH><A HREF="java script:reSort(3);">Size</A></TH> <TH><A HREF="java script:reSort(4);">Created</A></TH> <TH><A HREF="java script:reSort(5);">Last modified</A></TH> <TH><A HREF="java script:reSort(6);">Last accessed</A></TH> </TR> <% ' With the array nicely sorted, this part is a piece of cake! For i = 0 To fileCount Response.Write "<TR>" & vbNewLine For j = 0 To UBound( theFiles(i) ) Response.Write " <TD>" & theFiles(i)(j) & "</TD>" & vbNewLine Next Response.Write "</TR>" & vbNewLine Next %> </TABLE>
Ja - tror jeg har set den før, men problemet er bare at.. som jeg læser ovenstående kode er der ubindelig meget unødigt kode, og vil gerne have skraldet det ned så min funktion bliver lagt i et array som bliver sorteret efter filnavnet..
Mine færdigheder er desværre ikke så meget i top så jeg kan sortere fra i ovenstående kode og få det til at fungere :(
hvad skal det nøjagtig sorterer i forhold til - abc - indsat dato ? - så kan jeg rette det til i morgen - er ved at være lidt mør i hovedet lige nu - sengetid ;-))))
<% CONST DIRECTORY = "/" ' relative path in virtual directories ' Specify one of these constants for "sortBy"... priorSort = -2 sortBy = 0 reverse = true path = Server.MapPath( DIRECTORY ) Set fso = CreateObject("Scripting.FileSystemObject") Set theCurrentFolder = fso.GetFolder( path ) Set curFiles = theCurrentFolder.Files Dim theFiles( ) ReDim theFiles( 500 ) ' arbitrary size! currentSlot = -1 ' start before first slot For Each fileItem in curFiles fname = fileItem.Name fext = InStrRev( fname, "." ) If fext < 1 Then fext = "" Else fext = Mid(fname,fext+1) currentSlot = currentSlot + 1 If currentSlot > UBound( theFiles ) Then ReDim Preserve theFiles( currentSlot + 99 ) End If theFiles(currentSlot) = Array(fname,fext,ftype,fsize,fcreate,fmod,faccess) Next fileCount = currentSlot ' actually, count is 1 more, since we start at 0 ReDim Preserve theFiles( currentSlot ) ' really not necessary...just neater! 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 For i = fileCount TO 0 Step -1 minmax = theFiles( 0 )( sortBy ) minmaxSlot = 0 For j = 1 To i mark = (strComp( theFiles(j)(sortBy), minmax, vbTextCompare ) > 0) minmax = theFiles( j )( sortBy ) minmaxSlot = j Next Next %> <TABLE width="200" Border=1 CellPadding=3> <TR> <TH>Fil navn - hentet stigende abc </TH> '</TR> <% ' With the array nicely sorted, this part is a piece of cake! For i = 0 To fileCount Response.Write "<TR>" & vbNewLine For j = 0 To UBound( theFiles(i) ) Response.Write " <TD>" & theFiles(i)(j) & "</TD>" & vbNewLine Next Response.Write "</TR>" & vbNewLine Next %> </TABLE>
Mitbrugernavn: hvis sorteringen ikke virker, vil det jo være bestemt af den rækkefølge filerne ligger i mappen. Og det er sikkerh sorteret rigtigt på din server.
kew1n>> Hvis du ikke sorterer, vil FileSystemObject returnere det, som det ligger på serveren. Så hvis serveren sorterer på navn, bliver det også vist sorteret efter navn, og hvis serveren sorterer efter dato, vil det også blive vist sådan.
Nu havde Mitbrugernavn jo lavet en kode, der skulle sortere, men som du selv sagde, så det ikke sorteret ud, så derfor havde jeg en teori om, at sorteringen ikke satte i kraft, og derfor blev filerne bare vist, som de lå på serveren. =) Derfor også den store forskel, når du og Mitbrugernavn afprøvede koden på hver jeres server.
det var også min tanke at den ikke sorterede - derfor et tjek på det første script om det var ok - men lidt underligt for scriptet har jeg brug flere gange uden problemer og nettop hvor der var rod i visningen ;-))
Beklager jeg først svarer nu, har været væk fra computeren. Jeg står desværre ikke for selve webhotellet / serveren filerne ligger på.
Jeg troede at ved at lægge det i et array så kunne filerne sorteres uden at det blev bestemt af serveren - kun af koden?
--
danielmellgaardfrost : ser ret nemt og overskueligt ud, men kører desværre ikke på .NET server :(
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.