Compartir una carpeta con IIS para que esté accesible a través de una página web es algo sencillo y útil en determinadas ocasiones: basta con crear una carpeta virtual y habilitar el listado de directorios.
Lo malo es que IIS no nos ofrece muchas opciones para personalizar el formato del listado. Después de buscar un rato en Google no encontré ninguna alternativa que me convenciese, así que en 5 minutos me monté una solución casera.
El código importa, pero el contexto más
Para hacer esto no voy a usar node, ni compojure, ni rails, ni, dios me libre, PHP. Todos los IIS que tengo cerca tienen instalado .NET así que lo más lógico es usarlo y no tener que instalar nada más.
Además, no todos tienen la última versión, por lo que usar Razor queda descartado y eso nos lleva a WebForms (!).
Si le unimos que no quiero tener que abrir el Visual Studio para compilar nada y no me quiero complicar la vida desplegando más ficheros de lo necesario, llegamos a un código feo donde se mezcla todo.
De todas formas, por si a alguien le sirve, aquí lo dejo.
El resultado
Para usarlo, sólo hace falta guardar el siguiente código como Default.aspx en la carpeta que queramos exponer vía web, convertir la carpeta virtual en una aplicación y permitir la ejecución de comandos.
OJO: esto es código de andar por casa, no hay control de errores, no está muy probado, … si lo quieres usar, allá tú.
<%@ Page Language="C#" AutoEventWireup="true"%> <%@ Import Namespace="System.IO" %> <!DOCTYPE html> <html> <script runat="server" type="text/C#"> public string GetFileLink(string fullFileName) { return fullFileName.Replace(Server.MapPath("~/"), ""); } public string GetFolderLink(string fullName) { return Request.Path + "?folder=" + Server.UrlEncode(fullName); } </script> <% string workingFolder = Server.MapPath("~"); string folder = string.IsNullOrEmpty(Request.Params["folder"]) ? workingFolder : Request.Params["folder"]; if (!folder.StartsWith(workingFolder)) throw new UnauthorizedAccessException( string.Format("Cannot access folder outside {0}", workingFolder)); DirectoryInfo directory = new DirectoryInfo(folder); %> <head> <title><%=directory.Name %></title> <style type="text/css"> * { font-family: Segoe UI, Tahoma, Verdana; font-size: 18px; color: #333; } body { margin: 25px auto; max-width: 960px; } h1 { font-size: 24px; padding-bottom: 12px; border-bottom: solid 1px #cecece; } ul { list-style: none; padding: 0px; } a { color: #000; text-decoration: none; border-bottom: 1px dotted #aaa; } a:visited { color: #aaa; } a:hover { border-bottom: 1px solid #000; } </style> </head> <body> <h1><%=directory.FullName%></h1> <ul> <% foreach (DirectoryInfo d in directory.GetDirectories()) { %><li class="folder">[ <a href="<%=GetFolderLink(d.FullName) %>"><%=d.Name%></a> ]</li><% } foreach (FileInfo f in directory.GetFiles()) { if (f.Name == Path.GetFileName(Request.Path)) continue; %><li class="file"><a href="<%=GetFileLink(f.FullName)%>"><%=f.Name%></a></li><% } %> </ul> </body> </html>
Acaba de morir un gatito.