{"id":7,"date":"2010-12-10T13:00:09","date_gmt":"2010-12-10T20:00:09","guid":{"rendered":"http:\/\/blog.perceptionreality.com\/?p=7"},"modified":"2014-02-09T13:03:01","modified_gmt":"2014-02-09T20:03:01","slug":"recursive-directory-listings-for-asp-net-in-c","status":"publish","type":"post","link":"http:\/\/blog.perceptionreality.com\/?p=7","title":{"rendered":"Recursive Directory Listings for ASP.NET in C#"},"content":{"rendered":"<p>A good, recursive directory lister can come in handy. Especially since IIS&#8217;s built-in directory lister doesn&#8217;t always cut the mustard. Or, maybe you require this functionality as part of a larger project.<\/p>\n<p>The issue of finding a flexible way to do directory listing, and with recursion, led me to writing my own. Take a look at the (commented!) code below. Feel free to comment with how you&#8217;ve implemented this, or even if you have any improvements.<\/p>\n<p>The code below is designed for accepting parameters, in case you have different root directories you&#8217;d like to call and list separately. To remove this functionality, simply remove any use of DirParam (and that first if statement).<\/p>\n<p>Here&#8217;s my C# code:<\/p>\n<pre style=\"font-family: consolas; font-size: 12px;\"><span style=\"color: blue;\">public<\/span>\u00a0<span style=\"color: blue;\">void<\/span>\u00a0Main()\r\n{\r\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue;\">string<\/span>\u00a0DirParam\u00a0=\u00a0Request.QueryString[<span style=\"color: #a31515;\">\"d\"<\/span>];\u00a0<span style=\"color: green;\">\/\/Check\u00a0for:\u00a0http:\/\/localhost\/list.aspx?d=[variable]<\/span>\r\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue;\">if<\/span>\u00a0(DirParam\u00a0!=\u00a0<span style=\"color: #a31515;\">\"tools\"<\/span>\u00a0&amp;&amp;\u00a0DirParam\u00a0!=\u00a0<span style=\"color: #a31515;\">\"drivers\"<\/span>)\u00a0<span style=\"color: green;\">\/\/Check\u00a0if\u00a0someone\u00a0tried\u00a0something\u00a0other\u00a0than\u00a0'tools'\u00a0or\u00a0'drivers',\u00a0in\u00a0my\u00a0particular\u00a0installation<\/span>\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Response.Write(<span style=\"color: #a31515;\">\"No\u00a0valid\u00a0directory\u00a0selected!\"<\/span>);\u00a0<span style=\"color: green;\">\/\/Can\u00a0only\u00a0use\u00a0'tools'\u00a0or\u00a0'drivers'<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue;\">return<\/span>;\u00a0<span style=\"color: green;\">\/\/Quit<\/span>\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #2b91af;\">DirectoryInfo<\/span>\u00a0rootDir\u00a0=\u00a0<span style=\"color: blue;\">new<\/span>\u00a0<span style=\"color: #2b91af;\">DirectoryInfo<\/span>(Server.MapPath(<span style=\"color: #a31515;\">\".\"<\/span>\u00a0+\u00a0<span style=\"color: #a31515;\">\"\/\"<\/span>\u00a0+\u00a0DirParam));\u00a0<span style=\"color: green;\">\/\/Set\u00a0root\u00a0directory\u00a0to\u00a0be\u00a0server\u00a0root\u00a0with\u00a0selected\u00a0directory\u00a0from\u00a0address\u00a0bar<\/span>\r\n\u00a0\u00a0\u00a0\u00a0WalkDirTree(rootDir);\u00a0<span style=\"color: green;\">\/\/Begin\u00a0walking\u00a0the\u00a0tree<\/span>\r\n}\r\n<span style=\"color: blue;\">public<\/span>\u00a0<span style=\"color: blue;\">void<\/span>\u00a0WalkDirTree(<span style=\"color: #2b91af;\">DirectoryInfo<\/span>\u00a0workingDir)\r\n{\r\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue;\">long<\/span>\u00a0FileSizeCheck\u00a0=\u00a00,\u00a0FileSize\u00a0=\u00a00;\r\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue;\">string<\/span>\u00a0FileSizeUnit\u00a0=\u00a0<span style=\"color: blue;\">null<\/span>;\r\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #2b91af;\">FileInfo<\/span>[]\u00a0files\u00a0=\u00a0workingDir.GetFiles(<span style=\"color: #a31515;\">\"*.*\"<\/span>);\u00a0<span style=\"color: green;\">\/\/Files\u00a0found\u00a0in\u00a0directory\u00a0collection<\/span>\r\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #2b91af;\">DirectoryInfo<\/span>[]\u00a0subDir\u00a0=\u00a0<span style=\"color: blue;\">null<\/span>;\u00a0<span style=\"color: green;\">\/\/Sub-directories\u00a0found\u00a0in\u00a0directory\u00a0collection<\/span>\r\n\u00a0\u00a0\u00a0\u00a0Response.Write(<span style=\"color: #a31515;\">\"&lt;li&gt;&lt;b&gt;\"<\/span>\u00a0+\u00a0workingDir.Name\u00a0+\u00a0<span style=\"color: #a31515;\">\"&lt;\/b&gt;&lt;\/li&gt;&lt;ul&gt;\"<\/span>\u00a0+\u00a0<span style=\"color: #a31515;\">\"\\n\"<\/span>);\u00a0<span style=\"color: green;\">\/\/Write\u00a0first\u00a0line\u00a0in\u00a0bulleted\u00a0list\u00a0(root\u00a0dir\u00a0name)<\/span>\r\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue;\">if<\/span>\u00a0(files\u00a0!=\u00a0<span style=\"color: blue;\">null<\/span>)\u00a0<span style=\"color: green;\">\/\/Keep\u00a0going\u00a0until\u00a0we\u00a0run\u00a0out\u00a0of\u00a0files<\/span>\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue;\">foreach<\/span>\u00a0(<span style=\"color: #2b91af;\">FileInfo<\/span>\u00a0item\u00a0<span style=\"color: blue;\">in<\/span>\u00a0files)\u00a0<span style=\"color: green;\">\/\/For\u00a0each\u00a0individual\u00a0file\u00a0in\u00a0collection...<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FileSizeCheck\u00a0=\u00a0item.Length;\u00a0<span style=\"color: green;\">\/\/Store\u00a0size\u00a0of\u00a0file\u00a0in\u00a0memory\u00a0so\u00a0we\u00a0don't\u00a0access\u00a0file\u00a0more\u00a0than\u00a0once<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue;\">if<\/span>\u00a0(FileSizeCheck\u00a0&gt;\u00a01073741824)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FileSize\u00a0=\u00a0FileSizeCheck\u00a0\/\u00a01024\u00a0\/\u00a01024\u00a0\/\u00a01024;\u00a0<span style=\"color: green;\">\/\/File\u00a0is\u00a0larger\u00a0than\u00a01.00GB,\u00a0simplify\u00a0to\u00a0GB\u00a0units<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FileSizeUnit\u00a0=\u00a0<span style=\"color: #a31515;\">\"GB\"<\/span>;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue;\">else<\/span>\u00a0<span style=\"color: blue;\">if<\/span>\u00a0(FileSizeCheck\u00a0&gt;\u00a01048576)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FileSize\u00a0=\u00a0FileSizeCheck\u00a0\/\u00a01024\u00a0\/\u00a01024;\u00a0<span style=\"color: green;\">\/\/File\u00a0is\u00a0larger\u00a0than\u00a01.00MB,\u00a0simplify\u00a0to\u00a0MB\u00a0units<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FileSizeUnit\u00a0=\u00a0<span style=\"color: #a31515;\">\"MB\"<\/span>;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue;\">else<\/span>\u00a0<span style=\"color: blue;\">if<\/span>\u00a0(FileSizeCheck\u00a0&gt;\u00a01024)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FileSize\u00a0=\u00a0FileSizeCheck\u00a0\/\u00a01024;\u00a0<span style=\"color: green;\">\/\/File\u00a0is\u00a0larger\u00a0than\u00a01.00KB,\u00a0simplify\u00a0to\u00a0KB\u00a0units<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FileSizeUnit\u00a0=\u00a0<span style=\"color: #a31515;\">\"KB\"<\/span>;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue;\">else<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FileSize\u00a0=\u00a0FileSizeCheck;\u00a0<span style=\"color: green;\">\/\/File\u00a0is\u00a0smaller\u00a0than\u00a01.00KB,\u00a0show\u00a0size\u00a0as-is<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FileSizeUnit\u00a0=\u00a0<span style=\"color: #a31515;\">\"B\"<\/span>;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Response.Write(<span style=\"color: #a31515;\">\"&lt;li&gt;&lt;a\u00a0href=\\\"\"<\/span>\u00a0+\u00a0MapURL(item)\u00a0+\u00a0<span style=\"color: #a31515;\">\"\\\"&gt;\"<\/span>\u00a0+\u00a0item.Name\u00a0+\u00a0<span style=\"color: #a31515;\">\"&lt;\/a&gt;\u00a0[\"<\/span>\u00a0+\u00a0FileSize\u00a0+\u00a0FileSizeUnit\u00a0+\u00a0<span style=\"color: #a31515;\">\"]&lt;\/li&gt;\"<\/span>\u00a0+\u00a0<span style=\"color: #a31515;\">\"\\n\"<\/span>);\u00a0<span style=\"color: green;\">\/\/...list\u00a0and\u00a0create\u00a0hyperlinks<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0subDir\u00a0=\u00a0workingDir.GetDirectories();\u00a0<span style=\"color: green;\">\/\/Collect\u00a0sub-directories\u00a0in\u00a0current\u00a0directory<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue;\">foreach<\/span>\u00a0(<span style=\"color: #2b91af;\">DirectoryInfo<\/span>\u00a0dir\u00a0<span style=\"color: blue;\">in<\/span>\u00a0subDir)\u00a0<span style=\"color: green;\">\/\/For\u00a0each\u00a0directory\u00a0found\u00a0in\u00a0current\u00a0directory...<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0WalkDirTree(dir);\u00a0<span style=\"color: green;\">\/\/...recursively\u00a0walk\u00a0the\u00a0tree<\/span>\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0Response.Write(<span style=\"color: #a31515;\">\"&lt;\/ul&gt;\"<\/span>);\u00a0<span style=\"color: green;\">\/\/End\u00a0this\u00a0sub-directory's\u00a0list<\/span>\r\n}\r\n<span style=\"color: blue;\">public<\/span>\u00a0<span style=\"color: blue;\">string<\/span>\u00a0MapURL(<span style=\"color: #2b91af;\">FileInfo<\/span>\u00a0item)\r\n{\r\n<span style=\"color: blue;\">string<\/span>\u00a0ServerRootPath\u00a0=\u00a0Server.MapPath(<span style=\"color: #a31515;\">\".\"<\/span>);\u00a0<span style=\"color: green;\">\/\/Determine\u00a0server\u00a0root<\/span>\r\n<span style=\"color: blue;\">string<\/span>\u00a0url\u00a0=\u00a0item.FullName.Substring(ServerRootPath.Length,item.FullName.Length-ServerRootPath.Length);\u00a0<span style=\"color: green;\">\/\/Subract\u00a0entire\u00a0server-side\u00a0path\u00a0from\u00a0server\u00a0root\u00a0to\u00a0determine\u00a0local\u00a0URL<\/span>\r\n<span style=\"color: blue;\">return<\/span>\u00a0url.Replace(<span style=\"color: #a31515;\">\"\\\\\"<\/span>,\u00a0<span style=\"color: #a31515;\">\"\/\"<\/span>);\u00a0<span style=\"color: green;\">\/\/Transform\u00a0Windows-style\u00a0path\u00a0to\u00a0HTTP-style\u00a0by\u00a0replacing\u00a0\\\u00a0with\u00a0\/<\/span>\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>A good, recursive directory lister can come in handy. Especially since IIS&#8217;s built-in directory lister doesn&#8217;t always cut the mustard. Or, maybe you require this functionality as part of a larger project. The issue of finding a flexible way to do directory listing, and with recursion, led me to writing my own. Take a look [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-7","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/blog.perceptionreality.com\/index.php?rest_route=\/wp\/v2\/posts\/7","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.perceptionreality.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.perceptionreality.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.perceptionreality.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.perceptionreality.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7"}],"version-history":[{"count":1,"href":"http:\/\/blog.perceptionreality.com\/index.php?rest_route=\/wp\/v2\/posts\/7\/revisions"}],"predecessor-version":[{"id":8,"href":"http:\/\/blog.perceptionreality.com\/index.php?rest_route=\/wp\/v2\/posts\/7\/revisions\/8"}],"wp:attachment":[{"href":"http:\/\/blog.perceptionreality.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.perceptionreality.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.perceptionreality.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}