Explorador de Carpetas y Archivos
[Usando los métodos estáticos de la clase Directory, la clase FileInfo y DirectoryInfo usted puede procesar unidades, carpetas y archivos de varias formas diferentes]

Fecha: 07/Feb/2005 (02/02/2005)
Autor: Arbis Percy Reyes Paredes - Perxindrome   ([email protected])

 


"¡No se si soy Percy soñando que era una máquina, o una máquina soñando que soy Percy!", pero la verdad es que por aportarte mis conocimientos y ser de utilidad en la programación, soñé que debí compartir contigo lo que hice con un poquito de creatividad. Esta vez vamos hablar de algo interesante y divertido. Se trata de manipular archivos y carpetas. Los archivos siempre han sido un aspecto muy importante en este mundo loco de la programación, ya que por ejemplo todos de alguna manera usamos archivos para almacenar datos y en muchos casos tenemos que manipular archivos y folders desde nuestra aplicación. Debido a esto organizar archivos en folders y procesar archivos en masa son ejemplos típicos de la programación. Ahora te pregunto: ¿Manipular archivos es muy común?, claro que si. Los lenguajes de programación de la plataforma .NET, incluidos Visual Basic .NET, Visual C# y las Extensiones administradas de C++, y otros lenguajes de distintos fabricantes, nos proporcionan muchas clases que nos permitirán realizar todo esto.

El espacio de nombres System.IO contiene tipos que permiten leer y escribir en los archivos y secuencias de datos, así como tipos que proporcionan compatibilidad básica con los archivos y directorios. Alguna de estas clases que se usaron en esta aplicación se muestran en la tabla siguiente.

Algunas Clases pertenecientes al espacio de nombres System.IO
Directory Expone métodos estáticos para crear, mover y enumerar archivos en directorios y subdirectorios.
DirectoryInfo Expone métodos de instancia para crear, mover y enumerar archivos en directorios y subdirectorios.
File Proporciona métodos estáticos para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creación de objetos FileStream.
FileInfo Proporciona métodos de instancia para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creación de objetos FileStream.
Stream Proporciona una vista genérica de una secuencia de bytes.
StreamReader Implementa un TextReader que lee los caracteres de una secuencia de bytes en una codificación determinada.
StreamWriter Implementa TextWriter para escribir los caracteres de una secuencia en una codificación determinada.

 

Bueno, ahora te explico lo que implementé, aunque creo que no será necesario hacerlo porque tal vez seas una de esas personas que prefiere probar la aplicación y allí experimentar, de todas maneras no cae mal explicarlo. Cuando ejecutes la aplicación, se mostrarán todos las carpetas y archivos por separado en diferentes listas, existe una para todas las carpetas del directorio actual y de la misma manera sucede para los archivos. Por defecto se mostrarán todas las carpetas y archivos de la unidad de disco "C:\", es aquí donde tú debes cambiar por otra unidad de disco e ir explorando cada carpeta, conforme vas haciendo esto te darás cuenta que todo, tanto subcarpetas como archivos, se irán actualizando automáticamente. En la parte de la lista donde se encuentran los archivos, tendrás la opción de abrirlos para que editarlos, esto funciona parecido al explorador de windows que tradicionalmente conocemos, pero tan sólo podrás abrir determinados archivos, ya que incluí código tan sólo para abrir archivos tipo *.doc, *.txt, *.wma, *.jpg, *.bmp, *.pdf...y otros más. Cuando hagas click en cualquiera de estos archivos, se abrirán automáticamente. Ah..¡¡¡ se me olvidaba, con respecto a las imágenes, estos se abren en un PictureBox dentro de otro formulario secundario, pero si quieres abrirlo en cualquier editor de imágenes debes averiguar el nombre del ejecutable del programa y seguir la forma como yo lo implementé y lo abrirá. Si quieres visualizar algunos detalles de todos los archivos actuales no olvides que existe un opción para realizar esto, sólo activa la casilla "Ver detalles".

Esta es lo que verás cuando ejecutes la aplicación:


Explorador de Carpetas y archivos


Aquí les paso el código en Visual Basic.NET:

'*************************************************************
'Autor: Arbis Percy Reyes Paredes - Perxindrome( Peruano )
'TODOS LOS DERECHOS RESERVADOS 
'*************************************************************
Imports System.IO

Public Class Form2
    Inherits System.Windows.Forms.Form

    'Controlador de errores genèrico. Para manejar cualquier error
    'que se presente en el proyecto.
    <STAThread()> Shared Sub Main()
        Try
            'El formulario padre o principal en Form2.
            Application.Run(New Form2)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Public Shared oFullName As String

    'Este módulo es para "vaciar" o mostrar todos los archivos
    'jpg  o bmp, sobre nuestro formulario principal. 
    Sub LlenarGraficos()
        Dim Archivo As String : Dim InfoArchivo As FileInfo
        Dim oPictureBox1 As PictureBox
        Dim oImage As Image
        Dim oPictureBox As PictureBox
        Dim Left As Integer = 230
        Dim Top As Integer = 40
        Dim control As Integer
        'Eliminamos todos los objetos PictureBox, 
        'de esta manera actualizamos las imágenes a mostrar.
        For control = Me.Controls.Count - 1 To 6 Step -1
            'Removemos o eliminamos el objeto.
            Me.Controls.Remove(Controls(control))
        Next
        'El método "Directory.GetCurrentDirectory" nos servirá para obtener 
        'el directorio actual.
        'El método "Directory.GetFiles()" nos permite recuperar todos 
        'los archivos del directorio actual.
        For Each Archivo In Directory.GetFiles(Directory.GetCurrentDirectory)
            'FileInfo: Proporciona métodos de instancia para crear, copiar, eliminar, 
            'mover y abrir archivos.
            'Utilizaremos FileInfo para recuperar las características de nuestro archivo,
            'como por ejemplo: nombre, extensión,tamaño... 
            InfoArchivo = New FileInfo(Archivo)
            If InfoArchivo.Extension.ToLower = ".bmp" Or InfoArchivo.Extension.ToLower = ".jpg" _
            Or InfoArchivo.Extension.ToLower = ".gif" Then
            oPictureBox = New PictureBox
            oImage = Image.FromFile(InfoArchivo.FullName)
            'GetThumbnailImage:Devuelve una vista en miniatura de el objeto oImage.
            'No olvides que éste método funciona bien si la imagen en miniatura
            'solicitada tiene un tamaño de aproximadamente 120 x 120
            'Le pasamos el valor 84 para el ancho y la altura de la imagen.
            oPictureBox.Image = oImage.GetThumbnailImage(84, 84, Nothing, Nothing)
            If Left > 900 Then Left = 230 : Top = Top + 94
            oPictureBox.Left = Left
            oPictureBox.Top = Top
            oPictureBox.Width = 84
            oPictureBox.Height = 84
            oPictureBox.Visible = True
            'Agregamos el objeto oPictureBox sobre nuestro formulario.
            Me.Controls.Add(oPictureBox)
            Left = Left + 94
        End If
    Next
End Sub
'Este módulo servirá para recuperar todos los archivos 
'de la carpeta actual o directorio actual.
Sub LlenarArchivos()
    Dim Archivos(), NombreArchivo As String : Dim InfoArchivo As FileInfo
    Dim oListViewItem As ListViewItem
    Archivos = Directory.GetFiles(Directory.GetCurrentDirectory)
    'Limpiamos el ListView1, de esta manera nos aseguramos de actualizarlo.
    ListView1.Items.Clear()
    Me.LstArchivos.Items.Clear()
    For Each NombreArchivo In Archivos
        InfoArchivo = New FileInfo(NombreArchivo)
        Me.LstArchivos.Items.Add(InfoArchivo.Name)
        'Recuperamos y mostramos tan solo el nombre del archivo, de no ser
        'así no tiene sentido mostrar la extensión por separado.
        oListViewItem = ListView1.Items.Add(Microsoft.VisualBasic.Left _
        (InfoArchivo.Name.ToString, Len(InfoArchivo.Name.ToString) - 4))
        'Mostramos la longitud del archivo en Bytes.
        oListViewItem.SubItems.Add(InfoArchivo.Length.ToString & " Bytes")
        'Mostramos la fecha en la que fue creado el archivo.
        oListViewItem.SubItems.Add(InfoArchivo.CreationTime)
        'Mostramos la extensión del archivo.
        oListViewItem.SubItems.Add(InfoArchivo.Extension)
        'Mostramos cantidad de atributos del archivo.
        oListViewItem.SubItems.Add(InfoArchivo.Attributes)
        'Mostramos la hora en la que se utilizó por última vez el archivo.
        oListViewItem.SubItems.Add(InfoArchivo.LastAccessTime)
        'Mostramos  la hora en la que se escribió por última vez en el archivo.
        oListViewItem.SubItems.Add(InfoArchivo.LastWriteTime)
    Next
End Sub
'Este módulo hace algo sencillo, muestra todas las carpetas de la unidad de Disco
'o todas las subcarpetas de una determinada carpeta.
Sub LlenarCarpetas(ByVal UnidadDeDisco As String)
    Try
        Dim Carpetas(), Carpeta As String : Dim InfoCarpeta As DirectoryInfo
        LstCarpetas.Items.Clear()
        'GetDirectories: Obtiene los nombres de los subdirectorios 
        'del directorio especificado.
        Carpetas = Directory.GetDirectories(UnidadDeDisco)
        LstCarpetas.Items.Clear()
        For Each Carpeta In Carpetas
            'DirectoryInfo es una clase que expone métodos de instancia para crear,
            'mover y enumerar archivos en directorios y subdirectorios
            'Utilizaremos DirectoryInfo para recuperar las características 
            'de las carpetas,como por ejemplo: nombre, extensión,tamaño... 
            InfoCarpeta = New DirectoryInfo(Carpeta)
            'Pero esta vez servirá para obtener el nombre.
            LstCarpetas.Items.Add(InfoCarpeta.Name)
        Next
        'SetCurrentDirectory: Establece el directorio de trabajo actual 
        'de la aplicación en el directorio especificado.
        Directory.SetCurrentDirectory(UnidadDeDisco)
        Me.Text = Directory.GetCurrentDirectory
    Catch ex As Exception
        'Hacemos la selección del unidad por defecto  C:\
        Me.CboUnidadDeDisco.SelectedIndex = 1
    End Try
End Sub

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles MyBase.Load
    Me.WindowState = FormWindowState.Maximized
    LlenarUnidades()
End Sub
Public Sub LlenarUnidades()
    Dim Unidades(), Unidad As String
    Me.LstCarpetas.Visible = True
    'GetLogicalDrives es un método que recupera los nombres de las unidades 
    'lógicas del equipo en la que estás trabajando actualemnte. 
    'Recuerda que lo hace con el formato "<letra de unidad>:\".
    Unidades = Directory.GetLogicalDrives
    For Each Unidad In Unidades
        Me.CboUnidadDeDisco.Items.Add(Unidad)
    Next
    'Una manera de realizar lo mismo 
    'Me.CboUnidadDeDisco.Items.AddRange(Unidades)
    Me.CboUnidadDeDisco.SelectedIndex = 1
    LlenarCarpetas(Me.CboUnidadDeDisco.SelectedItem)
End Sub

Private Sub ChkDetalles_CheckedChanged(ByVal sender As System.Object, ByVal e _
    As System.EventArgs) Handles ChkDetalles.CheckedChanged
    'Muestra los detalles de los archivos.
    If ChkDetalles.CheckState = CheckState.Checked Then
        LblFullName.Visible = True
        LblRuta.Visible = True
        ListView1.Visible = True
    Else
        'Oculta los detalles de los archivos.
        LblFullName.Visible = False
        LblRuta.Visible = False
        ListView1.Visible = False
    End If
End Sub
Public Sub AbrirImagen()
    'Simplemente este módulo, o como quieras llamarle, 
    'nos permite visualizar la imagen selecionada en un formato más grande.
    Dim ArchivosImagen(), ArchivoImagen As String
    ArchivosImagen = Directory.GetFiles(Directory.GetCurrentDirectory)
    For Each ArchivoImagen In ArchivosImagen
        Dim ImagenInfo As FileInfo
        ImagenInfo = New FileInfo(ArchivoImagen)
        If ImagenInfo.FullName.Equals(Directory.GetCurrentDirectory & "\" & _
        Me.LstArchivos.SelectedItem) Then
        'Recuerda que oFullName se ha declarado como Shared, esto 
        'permitirá usarlo desde otro formulario.
        oFullName = ImagenInfo.FullName.ToString
        'Instanciamos el Form AmpliarImagen 
        Dim ampliar As New AmpliarImagen
        'Visualizamos la imagen ampliada en un PictureBox dentro de otro formulario.
        ampliar.Show()
    End If
Next
End Sub

Private Sub CboUnidadDeDisco_SelectedIndexChanged_2(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles CboUnidadDeDisco.SelectedIndexChanged
LlenarCarpetas(Me.CboUnidadDeDisco.SelectedItem)
LlenarArchivos()
LlenarGraficos()
LblFullName.Text = Directory.GetCurrentDirectory.ToString
End Sub

Private Sub MenuItem2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MenuItem2.Click
MsgBox("   Arbis Percy Reyes Paredes  " + vbCrLf + _
"           Perxindrome   " + vbCrLf + _
"  Estudiante Ing. De Sistemas " + vbCrLf + _
"            4º Ciclo   " + vbCrLf + _
"Universidad Nacional De Trujillo " + vbCrLf + _
"             Perú      ")
End Sub

Private Sub LstArchivos_SelectedIndexChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles LstArchivos.SelectedIndexChanged
Dim Extension As String = Microsoft.VisualBasic.Right _
(Me.LstArchivos.SelectedItem, 3).ToLower
Dim MiProceso As New System.Diagnostics.Process
Dim MiArchivo As String = Me.LstArchivos.SelectedItem
Select Case Extension
        'Visualizamos la imagen.
    Case "jpg", "gif", "bmp" : AbrirImagen()
        'Abrimos  el archivo *.txt con el Bloc de Notas
    Case "txt" : MiProceso.Start("notepad.exe", MiArchivo)
        'Abrimos  el archivo *.doc con el word
    Case "doc" : MiProceso.Start("winword.exe", MiArchivo)
        'Abrimos  el archivo *.ppt con el Power Point
    Case "ppt" : MiProceso.Start("powerpnt.exe", MiArchivo)
        'Abrimos  el archivo *.pdf con el Acrobat
    Case "pdf" : MiProceso.Start("acroRd32.exe", MiArchivo)
        'Abrimos  el archivo *.xsl con el Excell
    Case "xsl" : MiProceso.Start("excel.exe", MiArchivo)
        'Arbrimos la página web
    Case "htm", "htm" & "l" : MiProceso.Start("IEXPLORE.exe", MiArchivo)
        'Abrimos el archivo de música con el Reproductor de Windows
    Case "wma", "mp3", "cda" : MiProceso.Start("wmplayer.exe", MiArchivo)
        'Esta línea dice que tú debes de quemarte los ojos toda la bendita moche buscando 
        'en el Administrador de Tareas de Windows los archivos *.exe  de cada programa con
        ' la cual quieres abrir los archivos que yo no he especificado....Hazlooooo..
    Case MsgBox("Por favor debe abrir este archivo con el programa respectivo.")
End Select
LblFullName.Text = Directory.GetCurrentDirectory.ToString & "\" & Me.LstArchivos.SelectedItem
End Sub

Private Sub LstCarpetas_SelectedIndexChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles LstCarpetas.SelectedIndexChanged
Select Case LstCarpetas.SelectedItem
    Case ".."
        'Establecemos cono directorio actual al directorio que contiene a esta.
        Directory.SetCurrentDirectory("..")
    Case Else
        'Actualizamos el directorio.
        Directory.SetCurrentDirectory(Directory.GetCurrentDirectory & "\" & _
        Me.LstCarpetas.SelectedItem)
End Select
Dim Carpetas(), Carpeta As String
Dim InfoCarpeta As DirectoryInfo
Dim CarpetaActual As String = Me.LstCarpetas.SelectedItem
Carpetas = Directory.GetDirectories(Directory.GetCurrentDirectory)
Me.LstCarpetas.Items.Clear()
'GetDirectoryRoot: Método que devuelve la información del volumen, la información de 
'raíz o ambas para la ruta de acceso especificada.
If Directory.GetCurrentDirectory <> Directory.GetDirectoryRoot(CarpetaActual) Then
    LstCarpetas.Items.Add("..")
End If
'Mostramos el nombre de cada carpeta en el ListBox LstCarpetas.
For Each Carpeta In Carpetas
    InfoCarpeta = New DirectoryInfo(Carpeta)
    LstCarpetas.Items.Add(InfoCarpeta.Name)
Next
LlenarArchivos()
LlenarGraficos()
'Visualizamos la ruta de las carpetas y archivos.
Me.Text = Directory.GetCurrentDirectory.ToString
LblFullName.Text = Directory.GetCurrentDirectory.ToString
End Sub

End Class
...y esto es la parte donde se muestra la ampliación de la imágen. Un detalle muy importante a tener en cuenta es lo siguiente: Cuando se muestre la imágen ampliada, debes darle CLICK DERECHO, observarás que podrás rotarla, alejarla y acercarla.

Ampliar imágen

Ya te cansantes de leer...?, bueno, ahora te traigo buenas noticias, "Los sonidos más altos son los más difíciles de oir.", por esto y muchas cosas más debemos seguir, por lo tanto aquí te muestro todo el código para manipular la imágen.

Public Class AmpliarImagen
    Inherits System.Windows.Forms.Form

    'Lo que sigue es el código completo para la manipulación de la imágen 
    'que se muestra, una de las cosillas que he creido conveniente agregar
    'es el de rotar o girar la imagen de varias maneras, además puedes acercar y 
    'alejar la imágen  de acuerdo a tus necesidades.
    Private Sub AmpliarImagen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MyBase.Load
        PicAmplio.Image = Image.FromFile(Form2.oFullName.ToString)
        PicAmplio.SizeMode = PictureBoxSizeMode.StretchImage
    End Sub

    Private Sub BtnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles BtnSalir.Click
        Close()
    End Sub

    Private Sub MenuSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MenuSalir.Click
        Close()
    End Sub

    Private Sub MenuAcercar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MenuAcercar.Click
        PicAmplio.Height = PicAmplio.Height * 1.25
        PicAmplio.Width = PicAmplio.Width * 1.25
    End Sub

    Private Sub MenuAlejar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MenuAlejar.Click
        PicAmplio.Height = PicAmplio.Height / 1.25
        PicAmplio.Width = PicAmplio.Width / 1.25
    End Sub

    Private Sub MenuDerecha_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MenuDerecha.Click
        PicAmplio.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
        Dim Temporal As Integer = PicAmplio.Height
        PicAmplio.Height = PicAmplio.Width
        PicAmplio.Width = Temporal
    End Sub

    Private Sub MenuIzquierda_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MenuIzquierda.Click
        PicAmplio.Image.RotateFlip(RotateFlipType.Rotate270FlipNone)
    End Sub

    Private Sub Menu90_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles Menu90.Click
        PicAmplio.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
        PicAmplio.Invalidate()
        Intercambio()
    End Sub

    Private Sub MenuVertical_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MenuVertical.Click
        PicAmplio.Image.RotateFlip(RotateFlipType.RotateNoneFlipY)
        PicAmplio.Invalidate()
    End Sub

    Private Sub Menu180_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles Menu180.Click
        PicAmplio.Image.RotateFlip(RotateFlipType.Rotate180FlipNone)
        PicAmplio.Invalidate()
    End Sub

    Private Sub Menu270_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles Menu270.Click
        PicAmplio.Image.RotateFlip(RotateFlipType.Rotate270FlipNone)
        PicAmplio.Invalidate()
        Intercambio()
    End Sub
    Public Sub Intercambio()
        Dim Temporal As Integer = PicAmplio.Height
        PicAmplio.Height = PicAmplio.Width
        PicAmplio.Width = Temporal
    End Sub

    Private Sub MenuHorizontal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MenuHorizontal.Click
        PicAmplio.Image.RotateFlip(RotateFlipType.RotateNoneFlipX)
        PicAmplio.Invalidate()
    End Sub
End Class

No olvides de darme tu voto en PanoramaBox, ya que es una manera de animarme a seguir compartiendo contigo lo que voy aprendiendo. Gracias

Bueno, espero que les sea de utilidad la idea que aporté. No olvides que "Aunque un programa sólo tenga tres líneas de largo, algún dia tendrá que ser mantenido.", si encuentras algunos errores o si tienes alguna idea para mejorar la aplicación...No dudes en escribirme al correo. Nos Vemos.

Espacios de nombres usados en el código de este artículo:

System.IO
System.Diagnostics


ir al índice

Fichero con el código de ejemplo: Perxi_Explorador.zip - Tamaño 83.8 KB