Mini Explorador – Mostrar Información de los Discos, Directorios y Archivos


Muchas veces necesitamos estar verificando el crecimiento de un disco duro, para alertar cuando llegue a un límite, o para sacar conclusiones con el crecimiento.

Puede que existan muchas herramientas para lo dicho anteriormente, pero pues es mejor hacer las nuestras.

.Net provee de unas clases especializadas para el manejo de Directorios, Archivos y Dispositivos de almacenamiento, el espacio de Nombre System.IO, la que usaremos es DriveInfo, que proporciona información sobre una Unidad, tiene un método estático GetDrives() con el cual obtenemos la lista de las unidades, incluye discos rígidos, unidades de red, unidades extraíbles, etc.

Voy a crear una demo donde se van a listar en una aplicación Windows Forms la lista de Unidades, y cuando selecciono una se van a mostrar información sobre el disco:

 

En el botón de “Unidades de Disco…” escribimos lo siguiente para adicionar a la lista los discos disponibles:

private void button1_Click(object sender, EventArgs e)
{
  lstDiscos.Items.Clear();
  DriveInfo[] d = DriveInfo.GetDrives();
  foreach (DriveInfo unidad in d)
   {
     try
      {
       lstDiscos.Items.Add(unidad.Name);
      }
    catch(Exception ex)
      {
        MessageBox.Show("Error leyendo los discos: " + ex.Message);
       }
   }
 }

Ahora, al seleccionar una Unidad, mostraremos algo de información, como el tipo de Unidad, el tamaño del disco, el espacio disponible, espacio ocupado.

El código va a ser en el evento SelectIndexChanged de la lista de Unidades:

private void lstDiscos_SelectedIndexChanged(object sender, EventArgs e)
{
 lstInfoDisco.Items.Clear();
 String unidad = lstDiscos.SelectedItem.ToString();
 DriveInfo d = new DriveInfo(unidad);
 if (d.IsReady)
  {
   lstInfoDisco.Items.Add("Espacio ocupado (GB): " + (d.TotalSize - d.AvailableFreeSpace) / 1024 / 1024 / 1024 + "\n");
   lstInfoDisco.Items.Add("Espacio disponible (GB): " + (d.TotalFreeSpace) / 1024 / 1024 / 1024 + "\n");
   lstInfoDisco.Items.Add("Espacio Total (GB): " + (d.TotalSize) / 1024 / 1024 / 1024 + "\n");
  }
 lstInfoDisco.Items.Add("Tipo Disco : " + d.DriveType.ToString() + "\n");
}

Los tamaños obtenidos, se obtienen en Bytes, por eso dividimos por 1024 para convertirlos en Gigas.

Con esta información podemos crear ahora una tarea programada para que nos guarde en un archivo de texto cada día la información de la unidad, y podemos crear alertas, para cuando el disco sobrepase un límite máximo de crecimiento, enviar correos o mostrar algún mensaje.

Para guardar la información en un archivo de texto, creamos un botón guardar, y modificamos la información obtenida para que se muestre el nombre del disco, luego en el botón escribimos lo siguiente:

private void button2_Click(object sender, EventArgs e)
{
 try
  {
    String cadenadatos = "";
    using (StreamWriter file = new StreamWriter("C:/Temporal/Discos.txt", true))
    {
      foreach (String info in lstInfoDisco.Items)
       {
         cadenadatos += info + " | ";
       }
      file.WriteLine(cadenadatos);
    }
    MessageBox.Show("Se ha guardado la información!");
  }
  catch (Exception ex)
  {
   MessageBox.Show("Se presentó un error guardando los datos: " + ex.Message);
  }
}

Para guardar los datos, usamos la clase StreamWriter, el constructor que usamos el indicamos a la clase el nombre del archivo y enviamos un valor true para que nos vaya adicionando la información en vez de crear un nuevo archivo cada vez que guardamos algo.

Ya vimos como listar los discos del sistema, ahora con esa misma información podríamos listar las carpetas de cada disco, los archivos de cada carpeta y la información de cada archivo 😀

Adicionamos un control TreeView  al formulario, donde se van a cargar los directorios y los archivos, este control que “muestra una colección jerárquica de elementos con etiquetas”, mejor dicho, actúa como un árbol jerárquico.

Modificamos el listBox de los Discos, para que cada vez que seleccionemos un disco, también nos muestre sus carpetas, adicionamos el siguiente código en el método SelectIndexChanged del LstDiscos:

trvCarpetas.Nodes.Clear();
if (d.IsReady)
{
  DirectoryInfo dir = new DirectoryInfo(unidad);
  foreach (DirectoryInfo sub in dir.GetDirectories())
   {
     trvCarpetas.Nodes.Add(sub.Name);
   }
  foreach (FileInfo fi in dir.GetFiles())
   {
     trvCarpetas.Nodes.Add(fi.Name);
   }
}

Lo que hicimos fue:

–          Se creó un objeto tipo DirectoryInfo, esta clase recibe como parámetro la dirección (path) del directorio que queremos obtener la información.

–          Recorremos el directorio y obtenemos sus directorios hijos

–          Agregamos el nombre de los directorios como un nodo del TreeView

–          Recorremos el directorio y obtenemos los archivos, y también son adicionados al TreeView

Para diferenciar los directorios de los archivos, podemos modificar el foreach que agrega los archivos al TreeView, para que adicione un objeto TreeNode que modificamos, quedaría así:

foreach (FileInfo fi in dir.GetFiles())
{
  TreeNode nodo = new TreeNode();
  nodo.Text = fi.Name;
  nodo.ForeColor = Color.Red;
  trvCarpetas.Nodes.Add(nodo);
}

Para llenar el árbol con las demás carpetas, vamos a hacerlo solo si seleccionamos un nodo del árbol y este tiene carpetas pues las agregamos al árbol, mejor dicho, cada que seleccionemos un nodo le agregamos sus archivos y carpetas respectivas.

Para ello se hace doble clic sobre el árbol, se crea un método AfterSelect, allí obtenemos el texto del nodo, y creamos otro objeto DirectoryInfo, luego agregamos las carpetas y archivos como nodos hijos:

String carpeta = trvCarpetas.SelectedNode.FullPath;
String Disco = lstDiscos.SelectedItem.ToString();
DirectoryInfo file = new DirectoryInfo(Path.Combine(Disco, carpeta));
foreach (DirectoryInfo sub in file.GetDirectories())
{
  trvCarpetas.SelectedNode.Nodes.Add(sub.Name);
}
foreach (FileInfo fi in file.GetFiles())
{
  TreeNode nodo = new TreeNode();
  nodo.Text = fi.Name;
  nodo.ForeColor = Color.Red;
  trvCarpetas.SelectedNode.Nodes.Add(nodo);
}
trvCarpetas.SelectedNode.Expand();

Como tenemos solo el nombre de la carpeta, usamos el método Combine de la clase Path, para combinar el texto del Disco con la carpeta, al terminar de adicionar los nodos, expandemos el Nodo con el método Expand.

Pero si lo ejecutamos, y seleccionamos un archivo nos va a salir un error porque el archivo no contiene más archivos (GetFiles), además de que cada vez que seleccionemos un nodo carpeta se van a volver a adicionar más nodos:

 

Para evitar que intente buscar archivos en un archivo, existe una propiedad llamada Atributtes, de la clase DirectoryInfo, con esta propiedad podemos saber si el archivo es Directorio, si está escondido, si es de Sistema, si es de Solo lectura, etc.

Para evitar que se repitan los nodos, podemos condicionar la búsqueda de archivos, solo si el nodo seleccionado no tiene nodos hijos, esto lo hacemos con el método GetNodeCount, con este método podemos saber la cantidad de nodos hijos de un nodo, recibe como parámetro un booleano que indica si incluye los nodos hijos de otros nodos contenidos, algo como nodos nietos jeje.

El código quedará así:

//buscar otros directorios de la carpeta seleccionada
if (trvCarpetas.SelectedNode.GetNodeCount(false) == 0)
{
 String carpeta = trvCarpetas.SelectedNode.FullPath;
 String Disco = lstDiscos.SelectedItem.ToString();
 DirectoryInfo file = new DirectoryInfo(Path.Combine(Disco, carpeta));
 String atributos = file.Attributes.ToString();
 if (atributos.Contains(FileAttributes.Directory.ToString()))
 {
   try
   {
    foreach (DirectoryInfo sub in file.GetDirectories())
    {
      trvCarpetas.SelectedNode.Nodes.Add(sub.Name);
    }
    foreach (FileInfo fi in file.GetFiles())
    {
      TreeNode nodo = new TreeNode();
      nodo.Text = fi.Name;
      nodo.ForeColor = Color.Red;
      trvCarpetas.SelectedNode.Nodes.Add(nodo);
    }
    trvCarpetas.SelectedNode.Expand();
    }
    catch (Exception ex)
    {
      MessageBox.Show("Se presentó un problema leyendo el directorio, error: " + ex.Message);
     }
   }
}

Para Finalizar, podemos listar los atributos de un archivo seleccionado, para ello agregamos un ListBox al frente del TreeView, donde mostraremos alguna información del archivo.

Modificamos el código para que cuando se detecte que el archivo no es un directorio, obtenga la información del archivo, información como Nombre, tamaño, Fecha Creación, Extensión, Atributos.

Agregamos lo siguiente en el sino de la validación if (atributos.Contains(FileAttributes.Directory.ToString())):

else
{
 // es un archivo
 lstInfoArchivo.Items.Clear();
 FileInfo infoArchivo = new FileInfo(file.FullName);
 lstInfoArchivo.Items.Add("Nombre: " + infoArchivo.Name + "\n");
 lstInfoArchivo.Items.Add("Tamaño en bytes: " + infoArchivo.Length + "\n");
 lstInfoArchivo.Items.Add("Fecha Creación: " + infoArchivo.CreationTime + "\n");
 lstInfoArchivo.Items.Add("Extensión:  " + infoArchivo.Extension + "\n");
 lstInfoArchivo.Items.Add("Atributos:  " + infoArchivo.Attributes.ToString() + "\n");
}

 

Código Fuente Aquí.

6 pensamientos en “Mini Explorador – Mostrar Información de los Discos, Directorios y Archivos

  1. Muy buena info. la verdad me sirvio mucho, pero necesitaria saber como listar las carpetas y archivos de un dispositivo móvil cuando se conecta a la pc para poder trabar con los mismos para descarga de archivos desde una colectora a la PC y viceversa, si me ayudan con eso me estarían salvando la vida mas o menos.. desde ya muchas gracias..!!
    Saludos

Deseas comentar o sugerir algo?

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s