Listar Archivos de una carpeta con LinQ y ASP.NET
Algunas veces debemos listar el contenido de una carpeta del servidor en nuestras intranets, por distintos motivos. Ahora que existe LinQ , a mi parecer es mucho más cómodo e intuitivo.
Para el ejemplo, vamos a tener un dropdownlist que va a contener una lista de todas las extensiones de archivo que hay en la carpeta, además un GridView que va a contener una lista con la info de los archivos cuya extensión coincide con lo seleccionado en el dropdownlist.
Partamos por el "Diseño", que es simplemente aplicar un autoformato sobre el GridView :) y el dropdownlist tiene la propiedad autopostback=true
Espacio de Nombres:
Imports System.Linq
Imports System.IO
Diseño:
Ahora veamos el código asociado al iniciar el formulario.
Código:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
Dim tipo= From archivo In Directory.GetFiles("/") _
Let extension = New FileInfo (archivo).Extension _
Select Ext = extension, _
descripcion = "Archivos " & extension _
Distinct
For Each f In tipo
filtro.Items.Add(New ListItem(f.descripcion, f.Ext))
Next
End If
End Sub
Algunos puntos que debemos ver de este código que sirve para listar en el dropdownlist que se llama filtro. Primero, hacemos la consulta sobre la coleccion que devuelve GetFiles de mi carpeta raíz, luego utilizo Let para setear la variable extension. Hay que tener en cuenta que si asignas a una variable un valor por medio de Let , ya no vas a poder asignarle nuevamente otro valor, es decir, solo una vez puedes asignarle un valor por este medio. Ya que podemos tener varios archivos con la misma extensión, ocupamos Distinct para que solo nos traiga una ocurrencia de "registros". Como vez es lo mismo que ocupar Distinct en una variable SQL.
Protected Sub filtro_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles filtro.SelectedIndexChanged
Dim archivos = From archivo In Directory.GetFiles("/") _
Where Me.filtro.SelectedValue = New FileInfo(archivo).Extension _
Select Nombre = New FileInfo(archivo).Name, _
FechaCreacion = New FileInfo(archivo).CreationTime, _
Carpeta = New FileInfo(archivo).DirectoryName, _
Extension = New FileInfo(archivo).Extension
Me.listado.DataSource = archivos
Me.listado.DataBind()
End Sub
En este código hacemos la consulta que nos trae la información de los archivos cuya extensión coincide con la selección del dropdownlist. Ocupamos Where para filtrar por la extensión sobre la misma colección y obtenemos la info de los archivos. Luego bindeamos la colección genérica archivos.
Y logramos lo que queríamos, espero que te siva!.
Te dejo acá el link el skydrive para que bajes el código.
Nos vemos y gracias por leer este post!.
Gonzalo