Avatar billede montago Praktikant
06. januar 2004 - 18:24 Der er 25 kommentarer og
1 løsning

sortering i script (modtaget af eagleeye)

Jeg har dette script som viser filer i en given mappe

Jeg vil gerne have filerne sorteret efter deres modified eller creation date... FormatDateTime(objFileItem.DateCreated, vbShortDate)

og gerne sådan at den nyeste står først (asc/desc)


<%
  SiteName = request.servervariables("script_name")
  strPhysicalPath = Server.MapPath(ShowSub)

    If ShowSub > " " then
    ShowSub = Replace(ShowSub, " ", "%20")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(strPhysicalPath)
    Set objFolderContents = objFolder.Files
    For Each objFileItem in objFolderContents
      Response.write "<tr><td>"
      if InStr(1,"jpg,bmp,gif", LCase(objFSO.GetExtensionName(objFileItem.name))) > 0 then
          Response.Write "<a href=""ShowCar.asp?filnavn=" & objFileItem.Name & "&showsub=" & Request.Querystring("ShowSub") & "&komplet=" & ShowSub & "/" & objFileItem.Name &""">" & objFileItem.Name & "</a>"
      end if
     
      if InStr(1,"zip", LCase(objFSO.GetExtensionName(objFileItem.name))) > 0 then
          Response.Write "<a href=""" & ShowSub & "/" & objFileItem.Name &""">" & objFileItem.Name  & "</a>"
      End if
      Response.write "</td><td>" & FormatDateTime(objFileItem.DateCreated, vbShortDate)
      Response.write "</td></tr>"
    Next
    Set objFSO = Nothing
  End if
%>
Avatar billede eagleeye Praktikant
06. januar 2004 - 19:06 #1
Der er et problem med FSO og det er man kan ikke få FSO til at sortere filerne. Så man må selv lave en sortering og det kan gøre på flere måder her to eksempler et med et array og som gør brug af et recordset.

Her er et eks som smider filerne i et array som så sorteres.:
http://www.aspfaqs.com/aspfaqs/ShowFAQ.asp?FAQID=118

Her er et eks hvor filerne smides i et recordset og sorteres:
http://www.roubaixinteractive.com/PlayGround/FSO/Sort_Folder_Contents.asp
Avatar billede erikjacobsen Ekspert
06. januar 2004 - 19:20 #2
Og jeg har fundet en gammel boblesortering ;))

<%
  dim d(),n()
  redim d(0)
  redim n(0)

  set fso = CreateObject("Scripting.FileSystemObject")
  set folder = fso.GetFolder(Server.MapPath("."))
  set files = folder.Files
  for each file in files
    redim preserve n(ubound(n)+1)
    n(ubound(n))=file.Name
    redim preserve d(ubound(d)+1)
    d(ubound(d))=file.DateLastModified
  next
  set files=Nothing
  set folder=Nothing
  set fso=Nothing

  changed=true
  do while changed
    changed=false
    for i=lbound(d) to ubound(d)-1
      if d(i)>d(i+1) then
        tmp=d(i):d(i)=d(i+1):d(i+1)=tmp
        tmp=n(i):n(i)=n(i+1):n(i+1)=tmp
        changed=true
      end if
    next
  loop

  for i=lbound(d) to ubound(d)
    response.write d(i) & " - " & n(i) & "<br>"
  next
%>
Avatar billede erikjacobsen Ekspert
06. januar 2004 - 20:25 #3
Så var det jeg kom i tanker om at jeg også engang have gjort det i JScript,
som på rigtig mange måder er langt bedre end sølle VB. Der kan det samme
script se sådan ud:

<%@language=jscript%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>JScript sortering</title>
</head>

<body>
<%
  fso = Server.CreateObject("Scripting.FileSystemObject");
  folder = fso.GetFolder(Server.MapPath("."));
  f = new Array();
  for (files=new Enumerator(folder.files);!files.atEnd();files.moveNext()) {
    f.push(files.item());
  }
 
  f.sort(function (a,b) {return a.DateLastModified-b.DateLastModified;} );

  for (i=0;i<f.length;i++) {
    Response.Write(f[i].DateLastModified+" "+f[i].name+"<br>");
  }
%>
</body>
</html>
Avatar billede montago Praktikant
06. januar 2004 - 20:26 #4
fandt ud af det via det script der stod på linket...

alt for fedt !!!

dog lidt vandskeligere lave file-objekterne om til links... uden også at få de andre egenskaber med i samme vending hehe...
<%
  sti = "Cars"
  ShowSub = sti & request("ShowSub")
  ShowSubLink = request("ShowSub")
  strPathInfo = ShowSub
  strPhysicalPath = Server.MapPath(strPathInfo)
 
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Set objFolder = objFSO.GetFolder(strPhysicalPath)
 
  For each Folder in objFolder.SubFolders
    If Left(Folder.Name,1)<>"_" Then
      Response.Write "<a href=""" & CurFile & "?ShowSub=" & ShowSubLink & "/"
      Response.Write(Replace(Folder.Name, " ", "%20"))
      response.write """>"
      Response.Write Folder.Name
      Response.Write "<br>"
    End if
  Next
 
  Set objFSO = Nothing
%>


<%
' 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.
sti = "Cars"
ShowSub = sti & request("ShowSub")

DIRECTORY = ShowSub '"cars" ' 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>

<SCRIPT Language="JavaScript">
function reSort( which )
{
    document.doSort.sortBy.value = which;
    document.doSort.submit( );
}
</SCRIPT>
<FONT Size="+2"> </FONT>
<P>
<div align="center">
  <TABLE Border=1 CellPadding=0 cellspacing=0 >
    <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><a href=""" & "cars/" & theFiles(i)(j) & """>" & theFiles(i)(j) & "</a>" & "</TD>" & vbNewLine
        Next
        Response.Write "</TR>" & vbNewLine
    Next
%>
Avatar billede montago Praktikant
06. januar 2004 - 20:29 #5
ehmm erik... kan desværre ikke bruge dine forslag... idet de mangler en hel del...
Avatar billede eagleeye Praktikant
06. januar 2004 - 20:42 #6
Den har en masse med og man kan selv ændre retning på flere ting. Vil du beholde det eller skal det kun være datoen som der sotertes efter?
Avatar billede eagleeye Praktikant
06. januar 2004 - 20:44 #7
doh.. misforstod dit sidste spørgsmål.. to sekuner
Avatar billede montago Praktikant
06. januar 2004 - 20:46 #8
tjaa... har kigget lidt på resultatet... det gode var at man kunne se sidste access time... dog kun hvis det er sket over ftp... tror jeg

jeg tror jeg beholder det... og ellers må jeg selv rode med det... da jeg gerne vil lære disse metoder.. indtil videre tak for hjælpen / linket
Avatar billede eagleeye Praktikant
06. januar 2004 - 20:46 #9
Prøv at rette:

Response.Write "    <TD><a href=""" & "cars/" & theFiles(i)(j) & """>" & theFiles(i)(j) & "</a>" & "</TD>"

Til:

Response.Write "    <TD><a href=""" & ShowSub & theFiles(i)(j) & """>" & theFiles(i)(j) & "</a>" & "</TD>"
Avatar billede montago Praktikant
06. januar 2004 - 20:47 #10
hvis du kender nogle gode steder på nettet hvor jeg kan lære filesystemobject metoderne osv... eller flere.. vil jeg meget gerne læse disse !
Avatar billede eagleeye Praktikant
06. januar 2004 - 20:47 #11
Der der skal vist lige en "/" ind:

Response.Write "    <TD><a href=""" & ShowSub & "/" & theFiles(i)(j) & """>" & theFiles(i)(j) & "</a>" & "</TD>"
Avatar billede eagleeye Praktikant
06. januar 2004 - 20:51 #12
Side omkring FSO object og folder, file objekt og en masse små eksempler:
http://www.w3schools.com/asp/asp_ref_filesystem.asp

og så der også flere artiker på side jeg linkede til:
http://www.aspfaqs.com/aspfaqs/ShowCategory.asp?CatID=4

En anden side men en kort forklaring til de enkelte funktioner:
http://www.devguru.com/technologies/vbscript/quickref/filesystemobject.html
Avatar billede montago Praktikant
06. januar 2004 - 20:53 #13
hehe havde jeg ikke tænkt på... med ShowSub... men havde nok fundet ud af det... nu virker sub dir's og deres filer også !
Avatar billede montago Praktikant
06. januar 2004 - 21:03 #14
W3schools er enorm god og forklarende !!
Avatar billede montago Praktikant
06. januar 2004 - 21:17 #15
hey, mens jeg har din opmærksomhed... er det muligt at vise filer uden extension... dvs. .jpg eller .asp osv...

fx index.asp = index

skal jeg klippe .asp væk ligsom du skrev i et andet svar ?
Avatar billede eagleeye Praktikant
06. januar 2004 - 21:23 #16
Ja du må selv klippe det væk.
Eller du kan bruge getbasename som giver "fornavnet" på filen:

http://www.w3schools.com/asp/met_getbasename.asp
Avatar billede montago Praktikant
06. januar 2004 - 21:25 #17
cool...
EagleEye... lav så et svar så du kan få dine velfortjente point !
Avatar billede eagleeye Praktikant
06. januar 2004 - 21:26 #18
Ok, her er et svar fra mig ;)
Avatar billede montago Praktikant
06. januar 2004 - 21:35 #19
need more help

Slut på sætning var ventet
/upload/index.asp, line 455, column 196
Response.Write "<a href=""ShowCar.asp?filnavn=" & objFileItem.Name & "&showsub=" & Request.Querystring("ShowSub") & "&komplet=" & ShowSub & "/" & objFileItem.Name &""">" & objFileItem.GetBaseName server.mappath objFileItem.Name & "</a>"
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------^
Avatar billede eagleeye Praktikant
06. januar 2004 - 21:39 #20
Prøv sådan her:

"<a href=""ShowCar.asp?filnavn=" & objFileItem.Name & "&showsub=" & Request.Querystring("ShowSub") & "&komplet=" & ShowSub & "/" & objFileItem.Name &""">" & objFileItem.GetBaseName (server.mappath (objFileItem.Name)) & "</a>"
Avatar billede montago Praktikant
06. januar 2004 - 21:40 #21
Der opstod en Microsoft VBScript-kørselsfejl (0x800A01B6)
Objektet understøtter ikke denne egenskab eller metode: 'GetBaseName'
Avatar billede eagleeye Praktikant
06. januar 2004 - 21:43 #22
arh functionen GetBaseName er i FSO objectet og ikke File objectet ;)
Så prøv:

"<a href=""ShowCar.asp?filnavn=" & objFileItem.Name & "&showsub=" & Request.Querystring("ShowSub") & "&komplet=" & ShowSub & "/" & objFileItem.Name &""">" & fso.GetBaseName (server.mappath (objFileItem.Name)) & "</a>"
Avatar billede montago Praktikant
06. januar 2004 - 21:45 #23
Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
Et objekt er obligatorisk: ''

men det må være fordi objektet har et andet navn...
Avatar billede montago Praktikant
06. januar 2004 - 21:45 #24
objFSO i stedet for fso
Avatar billede montago Praktikant
06. januar 2004 - 21:46 #25
det virker 100%... takker endnu engang for dit overblik !
Avatar billede eagleeye Praktikant
06. januar 2004 - 21:46 #26
ja ok ;)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester