el Guille, la Web del Visual Basic, C#, .NET y más...
Ir a la sección de Visual Studio 2005 Utilidades .NET 2.0

Buscar ficheros (rev 1)

Revisión 1.0.1.0

 
Publicado el 01/Sep/2007
Actualizado el 01/Sep/2007
Autor: Guillermo 'guille' Som

Revisión de la utilidad para buscar ficheros en los directorios (y subdirectorios) indicados, mostrando los ficheros en un ListView y pudiendo abrir el directorio que contiene el fichero hallado.



 

gsBuscar revisión 1:

No te voy a explicar "todo" lo que hace esta utilidad ni la historia del porqué existe... eso lo puedes ver en la página original de esta utilidad de buscar ficheros.

 

Aquí te contaré los cambios que he hecho.

Pero antes de contarte nada, quiero agradecer a Antonio Calle por las sugerencias que han hecho que me decida a hacer los cambios y publicarlos. Gracias.

 

¿Qué hay de nuevo viejo?

Pues eso, de esta forma te diré las cosas que hay nuevas, con respecto a la que publiqué el pasado día 29.

En el código que puse para bajar en la versión original ya tenía algunos cambios "no documentados" como es que al cerrarse el formulario se guardaban los valores del tamaño y posición del formulario, puede parecer una tontería, pero así el usuario no se sentirá "frustrado" al ver que cambió el tamaño o posición de la utilidad y esos valores no se "recuerdan".

Pero los cambios principales son estos:

1- El botón de Buscar ahora es el predeterminado, de esa forma, al pulsar la tecla INTRO se iniciará la búsqueda.
2- He añadido dos botones nuevos, uno de ellos servirá para abrir el fichero que esté seleccionado y el otro abrirá la carpeta en la que está ese fichero.
3- Al pulsar (doble clic) en un fichero de la lista, se abrirá el fichero o el directorio, según se pulse en el nombre del fichero (que está en la primera columna) o en el nombre del directorio (que está en la segunda columna).

En la figura 1 tienes el aspecto del formulario de la rev. 1 de gsBuscar en modo de diseño:

Figura 1. Aspecto del formulario en modo de diseño (rev 1)
Figura 1. Aspecto del formulario en modo de diseño (rev 1)

 

El primer cambio es bien sencillo, lo único que tenemos que hacer es asignar a la propiedad AcceptButton del formulario el botón que queramos que sea el predeterminado, en este caso es el botón de buscar (btnBuscar).

 

En el botón de Abrir fichero (btnAbrirFic) lo que hacemos es llamar al método Start de la clase Process para que lo abra con el programa que tenga asociado, por ejemplo, si el fichero es de tipo .doc se abrirá con Word o el programa que tengamos asociado para ese tipo de fichero.

Este es el código del evento Click del botón de Abrir fichero:

Private Sub btnAbrirFic_Click(ByVal sender As Object, _
                              ByVal e As EventArgs) _
                              Handles btnAbrirFic.Click

    With lvFics
        If .SelectedIndices.Count = 0 Then
            Exit Sub
        End If

        ' Abrir el fichero indicado
        ' Combinar los paths para que se agregue el separador de directorio
        ' si así hiciera falta
        Dim fic As String = Path.Combine(.SelectedItems(0).SubItems(1).Text, _
                                         .SelectedItems(0).SubItems(0).Text)
        Process.Start(fic)

    End With
End Sub

De este código solo quiero destacar el uso de Path.Combine para crear el nombre del fichero, ya que en la primera columna del ListView se muestra el nombre del fichero y en la segunda el directorio, pero ese nombre de directorio no termina con el símbolo de separación de directorios, (salvo que sea en en el directorio raíz donde está el fichero), por tanto con el método Combine de la clase Path nos aseguramos de que se añadirá ese separador de directorio si no está.

 

El código del botón Abrir directorio (btnAbrirDir) es como el que  teníamos antes en el evento DoubleClick del ListView:

Private Sub btnAbrirDir_Click(ByVal sender As Object, _
                              ByVal e As EventArgs) _
                              Handles btnAbrirDir.Click

    With lvFics
        If .SelectedIndices.Count = 0 Then
            Exit Sub
        End If

        ' Abrir la ventana con el directorio del fichero indicado
        Dim dir As String = .SelectedItems(0).SubItems(1).Text
        Process.Start("explorer.exe", dir)

    End With
End Sub

 

Para poder detectar en que parte del elemento seleccionado del ListView se ha hecho doble clic, he tenido que cambiar de evento la detección de esa pulsación, ya que el evento DoubleClick del ListView no me dice en qué columna se ha hecho esa pulsación.
Así que... para saber en que parte del nombre del fichero seleccionado se ha pulsado, lo que he hecho es usar el evento MouseDoubleClick del ListView, que es "casi" igual que el evento DoubleClick, pero con la ventaja de que el segundo parámetro del evento es del tipo MouseEventArgs y en ese parámetro tenemos la posición del cursor del ratón en el que se ha hecho esa doble pulsación.
Y como la posición del ratón siempre es relativa al control en el que se comprueba, lo que hago es comprobar si la posición "X" del puntero del ratón es menor que el ancho de la primera columna, de ser así, quiere decir que estamos pulsando en la parte que está en esa primera columna (el nombre del fichero), si no se cumple esa condición quiere decir que estamos pulsando en la parte del elemento seleccionado que está bajo la segunda columna, por tanto estamos pulsando en el nombre del directorio.
Puede que parezca una chapuza, pero funciona... y eso es lo que a mi me importa, je, je.

Aquí tienes el código del evento MouseDoubleClick del ListView en el que se abre el fichero con el programa que tenga asociado o se abre la carpeta que lo contiene según donde se pulse:

Private Sub lvFics_MouseDoubleClick(ByVal sender As Object, _
                                    ByVal e As MouseEventArgs) _
                                    Handles lvFics.MouseDoubleClick

    With lvFics
        If .SelectedIndices.Count = 0 Then
            Exit Sub
        End If

        ' Comprobar en que columna se ha hecho doble clic
        ' El valor de e.X es relativo al control,
        ' por tanto, no hace falta añadir nada más.
        If e.X < .Columns(0).Width Then
            ' El nombre

            ' Abrir el fichero indicado
            ' Combinar los paths para que se agregue el separador de directorio
            ' si así hiciera falta
            Dim fic As String = Path.Combine(.SelectedItems(0).SubItems(1).Text, _
                                             .SelectedItems(0).SubItems(0).Text)
            Process.Start(fic)

        Else
            ' El directorio

            ' Abrir la ventana con el directorio del fichero indicado
            Dim dir As String = .SelectedItems(0).SubItems(1).Text
            Process.Start("explorer.exe", dir)

        End If

    End With
End Sub

 

También he quitado un "refresco" al añadir los elementos al ListView con idea de que el parpadeo sea menor, pero sigue habiendo parpadeo... no se si había alguna propiedad del ListView que "aliviaba" ese parpadeo, pero no he dado con ella.

Lo que si he encontrado es otra propiedad que cambia el elemento por el que pasa el ratón y se muestra como un link: HotTracking. Asignando un valor True a esa propiedad conseguimos ese efecto. También se asigna un valor True a HoverSelection que debe tener ese valor verdadero cuando la otra propiedad lo tiene.
Si te decides a usar esa característica debes cambiar el código de MouseDoubleClick al evento MouseClick para que el usuario no tenga que hacer doble clic para abrir el fichero o el directorio.

 

Y esto es todo por ahora, lo siguiente que tengo pensado es que se pueda usar para buscar dentro de los ficheros, que ya tengo ganas de cambiar mi "vieja" aplicación de VB6 que tengo para hacer esas búsquedas, aunque sabiendo cómo trata .NET las cadenas, no se si será buena idea... de todas formas, lo comprobaré a ver que tal.

En cualquier caso, espero que lo que hay hasta ahora te sea de tanta utilidad como lo es para mi.

Nos vemos.
Guillermo


Código de ejemplo (comprimido):

Nota:
Este código es el de la revisión 1.0.1.0, aunque el número de la versión mostrada sigue siendo 1.0.0.0, pero no he cambiado el valor de la versión del ensamblado para que los datos almacenados en las "preferencias" del usuario sigan siendo válidos para esta revisión.

Fichero con el código para Visual Basic 2005: gsBuscar_vb.zip - 28.90 KB

(MD5 checksum: 72069158FB072DEF7506BA100C76F246)

Fichero con el código para Visual C# 2005: gsBuscar_cs.zip - 22.70 KB

(MD5 checksum: CE8107AC153581EAC6743D5DA99DA10D)


 


La fecha/hora en el servidor es: 23/12/2024 18:09:56

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024