<% '******************************************************* '* SmB ASP code * '* * '* This code is made available as a service to our * '* visitors and is provided strictly for the * '* purpose of illustration. * '* * '* * '* * '* Please direct all inquiries to smb@carsbg.net * '******************************************************* %> Directory browsing by SmBŪ <% ' This function takes a filename and returns the appropriate image for ' that file type based on it's extension. If you pass it "dir", it assumes ' that the corresponding item is a directory and shows the folder icon. Function ShowImageForType(strName) Dim strTemp ' Set our working string to the one passed in strTemp = strName ' If it's not a directory, get the extension and set it to strTemp ' If it is a directory, then we already have the correct value If strTemp <> "dir" Then strTemp = LCase(Right(strTemp, Len(strTemp) - InStrRev(strTemp, ".", -1, 1))) End If ' Debugging line used to perfect that above string parser 'Response.Write strTemp ' Set the part of the image file name that's unique to the type of file ' to it's correct value and set this to strTemp. (yet another use of it!) Select Case strTemp Case "asp" strTemp = "asp" Case "dir" strTemp = "dir" Case "htm", "html" strTemp = "htm" Case "gif", "jpg" strTemp = "img" Case "txt" strTemp = "txt" Case Else strTemp = "misc" End Select ' All our logic is done... build the IMG Tag for display to the browser ' Place it into... where else... strTemp! ' My images are all GIFs and all start with "dir_" for my own sanity. ' They end with one of the values set in the select statement above. strTemp = "" ' Set return value and exit function ShowImageForType = strTemp End Function Function up(strPath) dim a dim i,n dim str str = "" i = 0 n = 1 if not strPath = "/" then a = Split(strPath,"/") for each n in a i = i + 1 next Do while n < i - 2 str = str & "/" & a(n) n = n + 1 Loop str = right(str, Len(str) - 1) else str = strPath end if up = str End Function 'That's it for functions on this one! %> <%' Now to the Runtime code: Dim strPath 'Path of directory to show Dim objFSO 'FileSystemObject variable Dim objFolder 'Folder variable Dim objItem 'Variable used to loop through the contents of the folder ' A recordset object variable and some selected constants from adovbs.inc. ' I use these for the sorting code. Dim rstFiles Const adVarChar = 200 Const adInteger = 3 Const adDate = 7 ' You could just as easily read this from some sort of input, but I don't ' need you guys and gals roaming around our server so I've hard coded it to ' a directory I set up to illustrate the sample. ' NOTE: As currently implemented, this needs to end with the / if Request.QueryString("path") = "" then strPath = "/" Else strPath = Request.QueryString("path") if Not Request.QueryString("path") = "/" then strPath = strPath & "/" end if end if ' Create our FSO Set objFSO = Server.CreateObject("Scripting.FileSystemObject") ' Get a handle on our folder Set objFolder = objFSO.GetFolder(Server.MapPath(strPath)) ' Show a little description line and the title row of our table %> Contents of <%= strPath %>

<% ' First I deal with any subdirectories. I just display them and when you ' click you go to them via plain HTTP. You might want to loop them back ' through this file once you've set it up to take a path as input. It seems ' like the logical thing to do to me at least! %> <% For Each objItem In objFolder.SubFolders ' Deal with the stupid VTI's that keep giving our visitors 404's If InStr(1, objItem, "_vti", 1) = 0 Then %> <% End If Next 'objItem ' Now that I've done the SubFolders, do the files! ' In order to be able to sort them easily and still close the FSO relatively ' quickly I'm going to make use of an ADO Recordset object with no attached ' datasource. While it does have a slightly greater overhead then an array ' or dictionary object, it gives me named access to the fields and has built ' in sorting functionality. Set rstFiles = Server.CreateObject("ADODB.Recordset") rstFiles.Fields.Append "name", adVarChar, 255 rstFiles.Fields.Append "size", adInteger rstFiles.Fields.Append "date", adDate rstFiles.Fields.Append "type", adVarChar, 255 rstFiles.Open For Each objItem In objFolder.Files rstFiles.AddNew rstFiles.Fields("name").Value = objItem.Name rstFiles.Fields("size").Value = objItem.Size rstFiles.Fields("date").Value = objItem.DateCreated rstFiles.Fields("type").Value = objItem.Type Next 'objItem ' All done! Kill off our File System Object variables. Set objItem = Nothing Set objFolder = Nothing Set objFSO = Nothing ' Now we can sort our data and display it: ' Sort ascending by size and secondarily descending by date ' (by date is mainly for illustration since all our files ' are different sizes) rstFiles.Sort = "size ASC, date DESC" if Not rstFiles.EOF or not rstFiles.BOF then rstFiles.MoveFirst end if Do While Not rstFiles.EOF %> <% rstFiles.MoveNext Loop ' Close our ADO Recordset object rstFiles.Close Set rstFiles = Nothing 'Close the table %>
File Name: File Size (Kbytes): Date Created: File Type:
<%= ShowImageForType("dir") %>  [Upper Folder]      
<%= ShowImageForType("dir") %>  <%= objItem.Name %>   <%= objItem.DateCreated %> <%= objItem.Type %>
<%= ShowImageForType(rstFiles.Fields("name").Value) %> "><%= rstFiles.Fields("name").Value %> <%= FormatNumber(rstFiles.Fields("size").Value / 1024,2) %> <%= rstFiles.Fields("date").Value %> <%= rstFiles.Fields("type").Value %>
For tech support smb@carsbg.net