[Manual] Buscar archivos con VB

Iniciado por Mace Windu, 9 Enero 2009, 16:36 PM

0 Miembros y 1 Visitante están viendo este tema.

Mace Windu

Bien, el bueno de SmartGenius me pidió una pequeña guía para buscar archivos con Visual Basic .NET y aquí os la dejo como regalo de reyes.

Lo primero que vamos a hacer será crear un proyecto del tipo Windows Forms y una interfaz similar a ésta:


Una vez echo esto, empezemos a codear. Lo primero de todo que vamos a escribir es el código del evento Click de nuestro botón para añadir el directorio correcto a buscar.
Código (vbnet) [Seleccionar]
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim Directorio As New FolderBrowserDialog
If Directorio.ShowDialog = Windows.Forms.DialogResult.OK Then
TextBox3.Text = Directorio.SelectedPath
End If
End Sub

Cómo podéis ver creamos un nuevo control FolderBrowserDialog y preguntamos si el usuario ha pulsado el botón Aceptar en él. Si hace esto, el directorio seleccionado será el contenido del cuadro de texto deseado.

Bien, ahora viene lo realmente interesante. Antes que nada os sugiero que importéis el namespace System.IO:

Código (vbnet) [Seleccionar]
Imports System.IO

Vayamos al control Click de nuestro botón buscar. En nuestra miniaplicación se podrá buscar tanto por el nombre del fichero tanto por el contenido de éste. Para ello, preguntamos que RadioButton está seleccionado.
Código (vbnet) [Seleccionar]
If RadioButton1.Checked = True Then
' Buscar por nombre
Else
' Buscar por contenido
End If

Empezemos por la segunda opción, la de buscar por contenido. Antes que nada, borramos todos los items de nuestro ListBox por si se encuentran otros resultados de búsquedas anteriores.

Código (vbnet) [Seleccionar]
ListBox1.Items.Clear()

Por si surge algún error, utilizaremso la sentencia Try...Catch. En caso de que aparezca una excepción se creará un nuevo item en nuestro Listbox con la información del error.
Código (vbnet) [Seleccionar]

Try
Catch ex As Exception
ListBox1.Items.Add(ex.Message)
End Try

Lo primero que debemos hacer es declarar una variable que contendrá todos los archivos del directorio especificado. Para ello, gracias al método FindInFiles de la clase FileSystem lograremos dicha tarea.
Código (vbnet) [Seleccionar]
Dim Archivos As System.Collections.ObjectModel.ReadOnlyCollection(Of String)
Archivos = My.Computer.FileSystem.FindInFiles(TextBox3.Text, TextBox2.Text, True, FileIO.SearchOption.SearchAllSubDirectories)

En los parámetros de este método hemos especificado el directorio, el contenido a buscar, si distingue entre mayúsculas y minúsculas y si buscará en los subdirectorios, respectivamente.

Ahora sólo nos falta recorrer la colección y mostrar los resultados en nuestro Listbox.
Código (vbnet) [Seleccionar]
For Each Archivo As String In Archivos
ListBox1.Items.Add(Archivo)
Next

El código deberá quedar así:
Código (vbnet) [Seleccionar]
If RadioButton1.Checked = True Then
' Buscar por nombre
Else
' Buscar por contenido
ListBox1.Items.Clear()
Try
Dim Archivos As System.Collections.ObjectModel.ReadOnlyCollection(Of String)
Archivos = My.Computer.FileSystem.FindInFiles(TextBox3.Text, TextBox2.Text, True, FileIO.SearchOption.SearchAllSubDirectories)

For Each Archivo As String In Archivos
ListBox1.Items.Add(Archivo)
Next
Catch ex As Exception
ListBox1.Items.Add(ex.Message)
End Try
End If

Bien, ya sólo nos falta que logre buscar por el nombre del archivo. Para que logre buscar también los subdirectorios del directorio especificado, crearemos un método recursivo, es decir, que se llamará así mismo tantas veces como subdirectorios existan. Tendrá un argumento que será el directorio donde buscará.

Creamos dos variables, una para almacenar el directorio actual y otra para el archivo actual.
A continuación escribimos otro bloque Try..Catch con la misma intención que antes. Esta vez, recorremos todos los elementos de la colección que devuelve el método GetDirectories de la clase Directory pasandole como argumento el directorio deseado. Para no consumir todos los recursos del sistema, utilizaremos el método DoEvents de la clase Application, aunque perfectamente para esta tarea podríamos crear un hilo o hebra. Haríamos un proceso análogo para los archivos del directorio con el método GetFiles de la clase Directory, y esta vez, añadiríamos cada archivo a nuestro ListBox. Al final, debería quedarnos una cosa así:
Código (vbnet) [Seleccionar]
Private Sub BuscarDirectorio(ByVal sDirectorio As String)
Dim Directorio As String, Archivo As String
Try
For Each Directorio In Directory.GetDirectories(sDirectorio)
Application.DoEvents()
For Each Archivo In Directory.GetFiles(Directorio, TextBox1.Text)
ListBox1.Items.Add(Archivo)
Next
BuscarDirectorio(Directorio)
Next
Catch ex As System.Exception
ListBox1.Items.Add(ex.Message)
End Try
End Sub

Ahora, en el evento click de nuestró botón buscar, debemos llamar al método anterior. Nos quedaría tal que así:
Código (vbnet) [Seleccionar]
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If RadioButton1.Checked = True Then
ListBox1.Items.Clear()
BuscarDirectorio(TextBox3.Text)
Else
ListBox1.Items.Clear()
Try
Dim Archivos As System.Collections.ObjectModel.ReadOnlyCollection(Of String)
Archivos = My.Computer.FileSystem.FindInFiles(TextBox3.Text, TextBox2.Text, True, FileIO.SearchOption.SearchAllSubDirectories)

For Each Archivo As String In Archivos
ListBox1.Items.Add(Archivo)
Next

Catch ex As Exception
ListBox1.Items.Add(ex.Message)
End Try
End If
End Sub

Ya para terminar, podemos hacer que en el evento SelectedIndexChanged de nuestro ListBox ocurra lo siguiente:
Código (vbnet) [Seleccionar]

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
System.Diagnostics.Process.Start(ListBox1.SelectedItem.ToString())
End Sub

Con ello conseguiremos que al dar click sobre un item de la lista se abra dicho archivo.

Lo bueno siempre termina, y esto no es una excepción :P. Espero que les haya gustado, y disfruten del día de hoy.

Salu2

invisible_hack

Buen tutorial, aunque te agradeceria si también haces la correspondiente versión para la versión 6.0  :P
"Si no visitas mi blog, Chuck te dará una patada giratoria"

Mace Windu

Cita de: invisible_hack en  9 Enero 2009, 16:49 PM
Buen tutorial, aunque te agradeceria si también haces la correspondiente versión para la versión 6.0  :P

Como observarás, el .NET Framework nos facilita mucha tarea a los programadores de VB que migramos a .NET ;)

Salu2