Bookmark and Share

ASP Directory Listing

Try the demo or view the source code.

This example shows how to read a directory structure in ASP. The demo lists the contents of a few directories located on this site, including any subdirectories and their contents, along with some information on file sizes and last modified dates.

ASP provides access to files on the host server via the FileSystemObject. It is a generic object that can be used to access existing files and folders or to create new ones.

It also provides information on drives, paths and special file types but the focus for this example is on file and folder objects.

Security Note

File access permissions will apply to the script execution, so the user account which it runs under (such as an anonymous ID set up for web users) must have proper permissions to the files and directories accessed.

Other access permissions may be applied as well, such on Microsoft IIS web servers. Check your system documentation.

The Folder Object

To access a folder, you first create a FileSystemObject then use the GetFolder() method specifying the physical path of that folder.

<% set fs = CreateObject("Scripting.FileSystemObject")
   set folder = fs.GetFolder("C:\temp") %>

To find the path of a file on the local web site, the built-in Server.MapPath() function can be used to translate a URL to a physical path.

<% path = Server.MapPath("/about/") %>

Which might return "C:\Inetpub\wwwroot\about\" for example. This value can then be used in the GetFolder() call.

Among the Folder object's properties are the Files and SubFolders collections. These can be enumerated to list the folder contents.

The demo script does just this, generating a display for each file and subfolder along with some information on file size, last modified date, etc. using a subroutine called ListFolderContents().

<% sub ListFolderContents(path)

     dim fs, folder, file, item, url

     set fs = CreateObject("Scripting.FileSystemObject")
     set folder = fs.GetFolder(path)

    'Display the target folder and info.

     Response.Write("<li><b>" & folder.Name & "</b> - " _
       & folder.Files.Count & " files, ")
     if folder.SubFolders.Count > 0 then
       Response.Write(folder.SubFolders.Count & " directories, ")
     end if
     Response.Write(Round(folder.Size / 1024) & " KB total." _
       & "</li>" & vbCrLf)

     Response.Write("<ul>" & vbCrLf)

     'Display a list of sub folders.

     for each item in folder.SubFolders

     'Display a list of files.

     for each item in folder.Files
       url = MapURL(item.path)
       Response.Write("<li><a href=""" & url & """>" _
         & item.Name & "</a> - " _
         & item.Size & " bytes, " _
         & "last modified on " & item.DateLastModified & "." _
         & "</li>" & vbCrLf)

     Response.Write("</ul>" & vbCrLf)

   end sub %>

Note the recursive call the subroutine makes to itself for each subfolder. This allows all the entire file hierarchy to be traversed and displayed from whatever starting path is given.

In order to make hypertext links to each file, the physical file path has to be mapped to a URL, just like Server.MapPath() converted a URL to a physical path. Unfortunately, there is no built-in function for this.

Instead, the MapURL() function is defined to map a physical file path back to a URL.

<% function MapURL(path)

     dim rootPath, url

     'Convert a physical file path to a URL for hypertext links.

     rootPath = Server.MapPath("/")
     url = Right(path, Len(path) - Len(rootPath))
     MapURL = Replace(url, "\", "/")

   end function %>

It simply takes the physical path of the web site root directory and strips it from the given path. Then any backslash characters are replaced with forward slashes.