Recursive File List Control (ASP.NET)
This control lists files and folders within a given directory. It shows only the root directories and files, but if you click a folder in the list, your get the sub folders and files.
Control code (filelist.ascx)
<%@ Control Language="C#" %> <%@ Import Namespace="System.Collections" %> <script runat="server"> private void Page_Load(object sender, EventArgs e) { // add file types fileTypes.Add("doc"); fileTypes.Add("rtf"); fileTypes.Add("xls"); fileTypes.Add("pdf"); walkFolders(VirtualFolder); lnkReset.NavigateUrl = Url; } public string VirtualFolder = "/"; private ArrayList fileTypes = new ArrayList(); private ArrayList folders; private ArrayList Folders { get { if (folders==null) { if (PathInfo!=null) { folders = new ArrayList(PathInfo.Split(';')); } else { folders = new ArrayList(); } } return folders; } set { folders = value; } } private string Url { get { return HttpContext.Current.Request.Path; } } private string PathInfo { get { return HttpContext.Current.Request.QueryString["show"]; } } private string BuildQuery { get { string strList = string.Empty; for(int i=0; i<Folders.Count; i++) { strList += Server.UrlEncode(Folders[i].ToString()) + ";"; } if (strList!=string.Empty) { strList = "?show=" + strList.Substring(0, strList.LastIndexOf(';')); } return strList; } } private bool InQuery(string s) { for(int i=0; i<Folders.Count; i++) { if(Folders[i].ToString() == s) { return true; } } return false; } private bool AllowedFileType(string fileExt) { for(int i=0; i<fileTypes.Count; i++) { if(fileTypes[i].ToString() == fileExt.ToLower()) { return true; } } return false; } // based on code from http://groups.google.com/groups?selm=uUvzKryuDHA.540%40tk2msftngp13.phx.gbl&rnum=3 private void walkFolders(string rootPath) { // Open the list FileList.Text += "<ul>"; string mappedRoot = Server.MapPath(rootPath); try { // Iterate through each folder foreach (string folder in System.IO.Directory.GetDirectories(mappedRoot)) { string virtfolder = folder.Replace(mappedRoot, string.Empty); string subFolder = rootPath + virtfolder + "/"; string strList = string.Empty; if (InQuery(subFolder)) { Folders.Remove(subFolder); strList = BuildQuery; Folders.Add(subFolder); } else { Folders.Add(subFolder); strList = BuildQuery; Folders.Remove(subFolder); } string b = "<li> Folder: <a href=\"" + Url + strList + "\">" + Server.HtmlEncode(virtfolder) + "</a>"; FileList.Text += b; if (InQuery(subFolder)) { // Walk through this folder FileList.Text += Environment.NewLine; walkFolders(subFolder); } FileList.Text += "</li>" + Environment.NewLine; } } catch (System.Exception ex) { Trace.Write(ex.Source + " : " + ex.HelpLink + " : " + ex.Message); } try { // Iterate through the files in this folder foreach (string file in System.IO.Directory.GetFiles(mappedRoot)) { string fileName = file.Replace(mappedRoot, string.Empty); if (!AllowedFileType(getExt(fileName))) continue; // Remove path and prefix with LI string b = "<li> File: " + "<a href=\"" + rootPath + fileName + "\">" + Server.HtmlEncode(removeExt(fileName)) + "</a></li>"; // Put the fileName in the textbox FileList.Text += b + Environment.NewLine; } } catch (System.Exception ex) { Trace.Write(ex.Source + " : " + ex.HelpLink + " : " + ex.Message); } // Close the list FileList.Text += "</ul>" + Environment.NewLine; } private string removeExt(string fileName) { return fileName.Substring(0,fileName.LastIndexOf('.')); } private string getExt(string fileName) { int dot = fileName.LastIndexOf('.') + 1; return fileName.Substring(dot, fileName.Length - dot); } </script> <asp:HyperLink id="lnkReset" runat="server" Text="Reset List" /> <asp:Literal EnableViewState="False" runat="server" id="FileList" />
Page code (filelist.aspx)
<%@ Page Language="C#" Trace="False" ContentType="text/html" ResponseEncoding="iso-8859-1" %> <%@ Register TagPrefix="Files" TagName="List" Src="filelist.ascx" %> <html> <head> <title>File listing</title> </head> <body> <form runat="server"> <Files:List runat="server" VirtualFolder="/virtualdir/" /> </form> </body> </html>
Comments