Explorador de Carpetas y Archivos Fecha: 07/Feb/2005 (02/02/2005)
|
"¡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:
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.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 ClassNo 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
Fichero con el código de ejemplo: Perxi_Explorador.zip - Tamaño 83.8 KB