Oprettet ons. d. 06. august 2008 kl. 22:09:03

kew1n
kew1n (13.855 point. Point ude: 1.980)

GetFolder sortering

Hey Eksperter,

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.

Her er min side hvor filerne bliver "printet": http://www.0303.dk/ (...)

--

Min kode ser ud som følge - I må meget gerne rette den til så filerne bliver sorteret.

Tak på forhånd!

Mvh. Kevin


KODE:

<%

Set FSO    = Server.CreateObject("Scripting.FileSystemObject")
Set root     = FSO.GetFolder(Server.MapPath("billeder/"))


    For Each rootFile IN root.files
        strFileName  = rootFile.Name
%>
        <%=strFileName%><br />

<%
    Next
    Set FSO = Nothing
    Set root = Nothing
%>

Skrevet ons. d. 06. august 2008 kl. 22:13:39| #1

w13
w13 (109.516 point)
www.2biaz.dk
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.

Skrevet ons. d. 06. august 2008 kl. 22:15:16| #2

kew1n
kew1n (13.855 point)
det var dog irriternede :(

Som skrevet ovenfor er jeg ikke så ASP-kyndig endnu.. er der en der kan vise hvordan jeg kan lægge filerne i et array og så sortere det på den måde?

Skrevet ons. d. 06. august 2008 kl. 22:41:08| #3

mitbrugernavn
mitbrugernavn (27.256 point)
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>

Skrevet ons. d. 06. august 2008 kl. 22:51:11| #4

kew1n
kew1n (13.855 point)
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 :(

Ellers 1000 tak mitbrugernavn!

Skrevet ons. d. 06. august 2008 kl. 23:10:16| #5

mitbrugernavn
mitbrugernavn (27.256 point)
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 ;-))))

Skrevet ons. d. 06. august 2008 kl. 23:27:21| #6

kew1n
kew1n (13.855 point)
du må meget gerne rette det til så det sorterer efter abc eller talrækkefølge (1,2,3 osv).

Glæder mig til at tjekke imorgen :)
1000 tak!

sov godt så! hehe

Skrevet tor. d. 07. august 2008 kl. 08:00:48| #7

w13
w13 (109.516 point)
www.2biaz.dk
Hvad mener du med talrækkefølge?

Skrevet tor. d. 07. august 2008 kl. 08:34:54| #8

mitbrugernavn
mitbrugernavn (27.256 point)
lidt mere klar i hovedet ;-)))


<%
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>

Skrevet tor. d. 07. august 2008 kl. 18:20:18| #9

kew1n
kew1n (13.855 point)
w13 : jeg mente bare at hvis jeg har 4 filer med navnene 1,2,3,4.jpg så skulle de vises i følgende rækkefølge:

1.jpg
2.jpg
3.jpg
4.jpg

---

mitbrugernavn : det ser ikke ud til at det virker - du kan se resultatet her:
http://www.0303.dk/ (...)

Prøvede at lægge de samme filer op bare med a,b,c,d.jpg istedet for tal - men det fungerer ikke rigtigt.

Hvad går der galt?

Hvis det er nemmere så må du meget gerne lave det så den sorterer det efter tal (altså 1.jpg, 2.jpg, 3.jpg .. osv)

Skrevet tor. d. 07. august 2008 kl. 20:44:37| #10

mitbrugernavn
mitbrugernavn (27.256 point)
jeg har lige lavet de samme filer som du har og den har fin sortering tal først og derefter abc - har du rettet noget til ?????

Skrevet tor. d. 07. august 2008 kl. 21:12:29| #11

w13
w13 (109.516 point)
www.2biaz.dk
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.

Skrevet tor. d. 07. august 2008 kl. 21:17:10| #12

kew1n
kew1n (13.855 point)
Jeg har kun ændret stien til der hvor mine billeder ligger - ikke andet.. bare kopieret hele koden.

Det burde da ikke have betydning vel?

Skrevet tor. d. 07. august 2008 kl. 21:54:46| #13

w13
w13 (109.516 point)
www.2biaz.dk
Min pointe er, at forskellen måske skyldes serveren.

Skrevet tor. d. 07. august 2008 kl. 23:16:34| #14

kew1n
kew1n (13.855 point)
Troede ikke at serveren havde nogen betydning når man lagde det i et array og sorterede det?

Hmm..

Skrevet fre. d. 08. august 2008 kl. 08:06:28| #15

mitbrugernavn
mitbrugernavn (27.256 point)
det første script - 06/08-2008 22:41:08 - har du testet det ? og kan du sorterer der ?

Skrevet fre. d. 08. august 2008 kl. 09:30:54| #16

w13
w13 (109.516 point)
www.2biaz.dk
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.

Men det er selvfølgelig ikke sikkert.

Skrevet fre. d. 08. august 2008 kl. 10:13:28| #17

mitbrugernavn
mitbrugernavn (27.256 point)
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 ;-))

Skrevet søn. d. 10. august 2008 kl. 20:24:20| #18

mitbrugernavn
mitbrugernavn (27.256 point)
hvordan er det gået ????

Skrevet man. d. 11. august 2008 kl. 13:41:08| #19

danielmellgaardfrost
danielmellgaardfrost (7.050 point)
se hvor nemt det kan gøre med LINQ i .NET :)

http://blogs.msdn.com/ (...)

/Daniel

Skrevet man. d. 11. august 2008 kl. 15:51:15| #20

kew1n
kew1n (13.855 point)
Hej igen,

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 :(

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

hjælp til fejl

Oprettet den 1. februar 2012 kl. 10.54
sth giver 100 point for svar | Giv et svar »

Replace mellemrum

Oprettet den 27. januar 2012 kl. 07.25
carstenandersen giver 60 point for svar | Giv et svar »

Udtræk fra database

Oprettet den 21. januar 2012 kl. 23.38
wandaxp giver 30 point for svar | Giv et svar »

Seneste guides

Den gode bruger
Adgang til NAS-server via WAN
Kollektion af Batch tutorials (FJERNET)
Tilpas din YouTube afspiller


   




Tips & Tricks fra PC World

Teaser billede

Sådan fjerner du pladskrævende metadata fra dine fotos

Det er langt fra altid, at dine billeders metadata såsom kameramodel og geografisk placering er vigtige at bevare. JPG & PNG Stripper kan luge ud i billedfilerne, så de fylder meget mindre....


Anmeldelser fra PC World

Teaser billede

Test: Superlet bærbar med mange muligheder

Toshiba har med Satellite Z830 skabt en af verdens letteste ultrabooks. Den vejer 1,1 kilo, og computeren på 13 tommer ser på papiret ud til at være en oplagt rejsekammerat. Men den lave vægt har...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Samsung Galaxy S III på vej

Samsungs bedst sælgende smartphone nogensinde får en efterfølger om kort tid.


Nyheder fra Computerworld

Teaser billede

Apple retter hele 51 sikkerhedshuller i Mac OS X

Apple lukker hele 51 sårbarheder i Mac OS X, hvoraf de fleste er kritiske. Se her, hvor hullerne er.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger