Sei sulla pagina 1di 9

Listar archivos de

un directorio en
ASP .NET
Dos maneras distintas de acceder a carpetas y
archivos:

Interfaz System.Collection.IEnumerator y
Colecciones
File, Directory, FileInfo y DirectoryInfo de
System.IO
Fecha: 09/Abr/2005 (4 de Abril de 2005)
Autor: Emilio Prez Egido - Miliuco [emi@miliuco.net]

ASP .NET tiene varias formas de aceder a los archivos y subdirectorios contenidos en un
directorio. En este ejercicio se hace referencia a dos maneras diferentes de listar los archivos
existentes en una carpeta o directorio, ambas se basan en cdigo relativamente sencillo,
comprensible por programadores de nivel bsico / intermedio.

Imagen de la aplicacin en ejecucin


Mtodo 1: usando Colecciones y la interfaz
System.Collection.IEnumerator

Una coleccin (Collection) es un tipo especial de matriz o array especialmente preparado para
unas tareas determinadas. Los objetos Collection se crean desde las clases e interfaces del
espacio de nombres System.Collections. Algunas interfaces tiles de Collections son:

IEnumerator: para recorrer listas de valores


IList: para ordenar listas de valores
ICollection: para modificar listas de valores
ICloneable: para hacer copias de listas de valores

En este ejercicio se usa la interfaz IEnumerator (que admite una iteracin simple a travs de una
coleccin) y el mtodo GetEnumerator (que devuelve un enumerador que puede iterar por una
coleccin). IEnumerator es la interfaz base de todos los enumeradores.

Los enumeradores slo permiten la lectura de datos de la coleccin y no se pueden utilizar para
modificar la coleccin (acceden a las matrices en modo de slo lectura).
Inicialmente, el enumerador se coloca delante del primer elemento de la coleccin y mediante
sus mtodos podemos movernos por la lista:

Reset tambin devuelve el enumerador a la posicin inicial (delante del primer


elemento)
MoveNext desplaza el enumerador al primer elemento antes de leer el valor de
Current
Current devuelve el mismo objeto hasta que se llama a MoveNext o a Reset
MoveNext establece Current en el siguiente elemento
Alcanzado el final, el enumerador se coloca despus del ltimo elemento. Un enumerador no
tiene acceso exclusivo a la coleccin, sto ha de ser tenido en cuenta en lo que respecta a la
seguridad de los procedimientos (no proporciona gran seguridad).

En el cdigo de ejemplo se observa cmo se crea un array o lista para contener los nombres de
los archivos del directorio pasado en una variable de cadena y tambin se crea un enumerador
que itera a lo largo de los elementos de la lista; se puede obtener fcilmente el nmero de
archivos del directorio contando el nmero de elementos de la lista (i = lista1.Length).
El objeto Response permite interaccionar servidor con cliente, su mtodo Write enva resultados
HTTP al navegador web cliente. Aqu lo utilizamos para ir enviando cdigo HTML que va
formateando una tabla cuyas celdas se irn rellenando con texto y resultados de la ejecucin de
cdigo VB, aprovechando para formatear el aspecto del documento HTML gracias a mltiples
elementos Response.Write:

Sub listar1(ByVal sender As System.Object, ByVal e As System.EventArgs)


Try
Response.Write("<h2 align=center style='font-
family:verdana;'>Listar archivos de un directorio</h2>")
'array de cadenas para contener los nombres de los archivos del
directorio
Dim lista1() As String
lista1 = System.IO.Directory.GetFiles(ruta)
'objeto IEnumerator que permitir recorrer la lista de archivos
Dim lista2 As System.Collections.IEnumerator
'lista2 se forma desde el mtodo GetEnumerator de lista1
'GetEnumerator construye un objeto enumerador que contiene:
' - el nmero de versin de la coleccin
' - una referencia a los elementos de la coleccin
lista2 = lista1.GetEnumerator
'i: entero para contener el nmero de archivos del directorio
'j: entero para contener la longitud de la cadena ruta
i = lista1.Length
j = ruta.Length
'crear la tabla en cuyas celdas aparece la informacin
'se usan estilos CSS para dar formato a las celdas
Response.Write("<table align=center border=0'>")
Response.Write("<tr style='font-family:verdana; font-size:10pt;
font-weight:bold; text-align:center;background-color:black;
color:white;'><td>")
'cabecera de la tabla con el nombre del directorio
Response.Write("<b>Directorio: " & ruta2 & "</b>")
Response.Write("</td></tr>")
Response.Write("<tr style='font-family:verdana; font-size:10pt;
text-align:center;background-color:blue; color:white;'><td>")
'fila con el nmero de archivos del directorio
Response.Write("Nmero de archivos: <b>" & i & "</b>")
Response.Write("</td></tr>")
'se van leyendo los elementos de la coleccin hasta el final de
la misma
While lista2.MoveNext
Response.Write("<tr style='font-family:verdana; font-
size:10pt; text-align:left;background-color:Gainsboro; color:black;'><td>")
'lista.Current devuelve el nombre largo de archivo (con ruta
incluida)
'para dejar slo el nombre corto de archivo (sin la ruta):
' - si la variable ruta termina en \ se quita de
lista.Current la longitud de la variable
'(ruta termina en \ si se forma con ServerMapPath (ej: ruta =
Server.MapPath("/img"))
' - si la variable ruta NO termina en \ se quita de
lista.Current la longitud de la variable ms 1 carcter
'(ruta NO termina en \ si se forma con la ruta como cadena
sencilla (ej: ruta="C:\Windows")
If ruta.EndsWith("\") Then
Response.Write(CStr(lista2.Current).Remove(0, (j)))
Else
Response.Write(CStr(lista2.Current).Remove(0, (j + 1)))
End If
Response.Write("</tr></td>")
End While
Response.Write("</table>")
Catch pollo As Exception
Response.Write("<p align=center style='font-family:verdana; font-
size:10pt; color:red;'><b>" & _
pollo.Message & "</b></p>")
Response.End() 'detiene la carga de la pgina
End Try
Response.End() 'detiene la carga de la pgina
End Sub

Mtodo 2: usando File, Directory, FileInfo y DirectoryInfo de System.IO

El espacio de nombres System.IO contiene clases que facilitan el trabajo con archivos y
carpetas:

File y Directory: contienen mtodos estticos. Los miembros de File y de


Directory son miembros compartidos por lo que es ms sencillo su uso pues no es
necesario crear una instancia previa de su clase; sirven para crear, borrar y
modificar archivos y carpetas: Exists, Copy, Move, Delete, OpenText,
GetAttributes...
FileInfo y DirectoryInfo: contienen mtodos de instancia. por lo que es necesario
crear un objeto para poder utilizar la clase; sus mtodos sirven para extraer
informacin de los aributos de archivos y carpetas: Name, FullName,
CreationTime, etc...
Path: contiene mtodos para administrar cadenas
DirectoryInfo/nombre_de_archivo

En este ejercicio se utilizan las clases FileInfo y DirectoryInfo junto a matrices para contener los
nombres de las carpetas o archivos, para poder mostrar al usuario un listado de archivos
contenidos en el directorio seleccionado y en los subdirectorios de primer nivel, de entre los que
componen el sitio web del que forma parte esta aplicacin. Es muy sencillo retocar el cdigo
para que muestre archivos de directorios locales del disco duro fuera de las carpetas que
componen el servidor web pero para ello hay que tener permisos de acceso a esas carpetas, por lo
que puede no funcionar sirviendo estas pginas desde Internet (el proveedor de los servicios tal
vez no lo permita).

Mediante mltiples Response.Write y usando bucles For Each que recorren el


directorio especificado en la ruta, se va construyendo una tabla en la que se
muestra la lista de archivos, clasificados por la carpeta contenedora, informando
de su tamao y fecha de creacin y contando su nmero (por carpeta y el total)
Un array de String contiene los nombres de los archivos que hay en el directorio
(pasado como argumento al mtodo GetFiles de la clase Directory). Contando el
nmero de elementos de ese array sabemos el nmero de archivos del directorio.
Se necesitan objetos del tipo FileInfo y DirectoryInfo para poder extraer
informacin de archivos y carpetas.
Con un bucle For Each y un objeto de tipo FileInfo obtenemos la lista de archivos
del directorio y extraemos informacin de cada archivo (nombre, tamao y fecha
de creacin, por ejemplo).
Con un segundo bucle For Each y un objeto DirectoryInfo obtenemos la lista de
carpetas del directorio y extraemos el nombre de cada carpeta, para listar los
archivos de cada carpeta con un tercer For Each y otro objeto de tipo FileInfo
(sto permite listar los archivos contenidos en el directorio elegido y en los
subdirectorios de primer nivel).

'listar los archivos de un directorio y del primer subnivel de directorios


Sub listar3(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim archivo, carpeta As String 'para el nombre de archivos y carpetas
Dim sArchivos(), sCarpetas() As String 'array con los nombres de
archivos y carpetas
Dim carpetaInfo As DirectoryInfo 'objeto para extraer propiedades de
las carpetas
Dim archivoInfo As FileInfo 'objeto para extraer propiedades de los
archivos
Try
'el objeto Response permite interaccionar servidor con cliente,
'su mtodo Write enva resultados HTTP al navegador web cliente.
'Aqu lo utilizamos para ir enviando cdigo HTML que va
formateando una tabla
'cuyas celdas se irn rellenando con texto y resultados de la
ejecucin de cdigo VB
Response.Write("<h2 align=center style='font-
family:verdana;'>Listar archivos de un directorio</h2>")
'array con los nombres de archivo en el directorio actual
sArchivos = Directory.GetFiles(ruta)
sCarpetas = Directory.GetDirectories(ruta)
'nmero de archivos en el directorio
i = sArchivos.Length
'crear la tabla y la cabecera con ttulos de columnas
Response.Write("<table align=center border=0 style='font-
family:verdana; font-size:10pt;'>")
Response.Write("<tr style='background-color:black; color:white;
font-weight:bold;'>")
Response.Write("<td>Nombre</td>")
Response.Write("<td align=right>Tamao</td>")
Response.Write("<td align=center>Fecha</td>")
Response.Write("<td align=center>Hora</td></tr>")
'seccin que lista los archivos que cuelgan directamente del
directorio actual
'condiciones: listar slo en carpetas con al menos 1 archivo
If i > 0 Then
Response.Write("<tr><td colspan=4 align=center
style='background-color:gray; color:white;'>")
Response.Write("<b>Directorio " & ruta2 & " = <b>" & i & "
archivos</b>")
End If
Response.Write("</td></tr>")
'Obtener lista de archivos contenidos en el directorio actual
For Each archivo In sArchivos
archivoInfo = New FileInfo(archivo)
Response.Write("<tr>")
Response.Write("<td bgcolor=Gainsboro>" & archivoInfo.Name &
"</td>")
Response.Write("<td bgcolor=Gainsboro align=right>" &
archivoInfo.Length.ToString("#,#") & " bytes</td>")
Response.Write("<td bgcolor=Gainsboro align=center>" &
archivoInfo.CreationTime.ToShortDateString & "</td>")
Response.Write("<td bgcolor=Gainsboro align=center>" &
archivoInfo.CreationTime.ToLongTimeString & "</td></tr>")
Next
'Obtener lista de directorios del directorio actual
For Each carpeta In sCarpetas
'For Each carpeta In Directory.GetDirectories(ruta)
carpetaInfo = New DirectoryInfo(carpeta)
'array con nombres de archivos en cada directorio
sArchivos = Directory.GetFiles(carpeta)
'nmero de carpetas en el directorio
j = sArchivos.Length
'seccin que lista las carpetas que cuelgan directamente del
directorio
'condicin: listar slo en carpetas con al menos 1 archivo
'If j > 0 Then
Response.Write("<tr><td colspan=4 align=center
style='background-color:gray; color:white;'>")
'condicin: ocultar algunos directorios que no queremos que
aparezcan en la lista
If carpetaInfo.Name <> "nombre_de_carpeta" Then
If ruta2 = "/" Then
Response.Write("<b>Directorio: " & ruta2 &
carpetaInfo.Name & " = <b>" & j & " archivos</b>")
ElseIf ruta2.StartsWith("C:\") Then
Response.Write("<b>Directorio: " & ruta2 & "\" &
carpetaInfo.Name & " = <b>" & j & " archivos</b>")
Else
Response.Write("<b>Directorio: " & ruta2 & "/" &
carpetaInfo.Name & " = <b>" & j & " archivos</b>")
End If
End If
'End If
Response.Write("</td></tr>")
'calcular el nmero total de archivos que hay en los
directorios
i += j
'obtener lista de archivos contenidos en los directorios de
primer nivel
'seccin que lista los archivos de esos directorios
For Each archivo In Directory.GetFiles(carpeta)
archivoInfo = New FileInfo(archivo)
Response.Write("<tr bgcolor=Gainsboro><td>/" &
carpetaInfo.Name & archivoInfo.Name & "</td>")
Response.Write("<td bgcolor=Gainsboro align=right>" &
archivoInfo.Length.ToString("#,#") & " bytes</td>")
Response.Write("<td bgcolor=Gainsboro>" &
archivoInfo.CreationTime.ToShortDateString & "</td>")
Response.Write("<td bgcolor=Gainsboro>" &
archivoInfo.CreationTime.ToLongTimeString & "</td></tr>")
Next
Next
Catch pollo As Exception
''finalizar la tabla con el N total de archivos listados
''slo si el TextBox contiene alguna ruta
'If ruta2 <> "" Then
' Response.Write("<tr><td colspan=4 align=center
style='background-color:blue; color:white;'>")
' Response.Write("<b>Nmero total de archivos = " & i &
"</b>")
' Response.Write("</td></tr>")
'End If
Response.Write("</table>")
Response.Write("<p align=center style='font-family:verdana; font-
size:10pt; color:red;'>" & _
"<b>ERROR: " & pollo.Message & "</b></p>")
Response.End()
End Try
'finalizar la tabla con el N total de archivos listados
Response.Write("<tr><td colspan=4 align=center style='background-
color:blue; color:white;'>")
Response.Write("<b>Nmero total de archivos = " & i & "</b>")
Response.Write("</td></tr>")
Response.Write("</table>")
Response.End() 'detiene la carga de la pgina
End Sub

Cdigo comn a ambos mtodos

La pgina aspx presenta al usuario un cuadro de texto en el que se introduce la ruta a una carpeta
del servidor web (incluido el directorio raz /) o a una carpeta del disco duro, teniendo en cuenta
que, ejecutada desde Internet, esta aplicacin intenta acceder a contenidos que, dependiendo de
la configuracin del servidor web, es posible que no sean accesibles por no tener permisos
suficientes para ello; es recomendable descargar la aplicacin a nuestro disco duro y probarla
desde ah.

Se necesitan variables (String para los nombres de archivos y carpetas y arrays para contener las
listas de archivos y carpetas y poder contarlos):
Dim archivo, carpeta As String 'para el nombre de archivos y
carpetas
Dim sArchivos(), sCarpetas() As String 'array con los nombres de
archivos y directorios
Dim a, b As Integer 'para llevar la cuenta del n de archivos

Se crea el ttulo de la pgina web en tiempo de ejecucin, al cargar la pgina:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles MyBase.Load
Response.Write("<HEAD><TITLE>Listado de
archivos</TITLE></HEAD>")
End Sub

La propiedad text del cuadro de texto se pasa, en el cdigo Visual Basic, a una variable String
que ayuda a construir la ruta hacia el directorio usando Server.MapPath():

'ruta relativa al directorio cuyos archivos se van a listar


Dim ruta2 As String
'asignacin del texto del TextBox
ruta2 = txt.Text
'cadena que almacena la ruta dentro del servidor web
Dim ruta As String = Server.MapPath(ruta2)

Por ltimo, se propone una manera diferente a la habitual para descargar el archivo comprimido
zip:

mtodo clsico mediante cdigo HTML:

<A HREF="archivos.zip"></A>

mtodo propuesto usando cdigo .NET:

o en la pgina aspx se asocia el evento ONCLICK de un botn con el


mtodo zip:

<ASP:BUTTON ID="bt5" RUNAT="server"


TEXT="Aplicacin completa en Visual Studio 2003"
ONCLICK="zip"></ASP:BUTTON>

o en el cdigo vb se desarrolla el mtodo zip usando Response.Redirect para


descargar el archivo:
o 'descargar el archivo zip con la aplicacin completa
o Sub zip(ByVal sender As System.Object, ByVal e As
System.EventArgs)
o Response.Redirect("archivos.zip", True)
End Sub
Espacios de nombres usados en esta aplicacin

System.IO
System.Collections

Y, por supuesto, Namespace bsicos en las aplicaciones ASP .NET:

System
System.Web
System.Web.UI
System.Web.UI.WebControls
System.Web.UI.HtmlControls

Fichero con el cdigo de ejemplo: miliuco_listado.zip - 63 KB

Potrebbero piacerti anche