Inicio > .NET Framework, Apunte, C# > Obtener información de una unidad de disco

Obtener información de una unidad de disco


.NET Framework pone a nuestra disposición una clase útil que nos servirá para obtener información relacionada con una unidad de disco. Estamos hablando de DriveInfo, ubicada en el espacio de nombres System.IO.

Comencemos con el constructor. Éste toma una cadena de texto como único parámetro, que representa la unidad de disco a la que se refiere. Ojo, porque lanza una excepción (ArgumentException) si se pasa un nombre de unidad inválido. Tradicionalmente usaríamos algo así:

 

try
{
    DriveInfo drive = new DriveInfo("C");
    ...hacer algo...
}
catch (ArgumentException e)
{
    Console.WriteLine("Formato inválido de unidad.");
}

 

Una alternativa, claro está, es listar las unidades de disco duro existentes. Para ello contamos con el método estático DriveInfo.GetDrives, que nos devuelve un array de objetos DriveInfo. Algo así:

DriveInfo[] drives = DriveInfo.GetDrives();
foreach (DriveInfo drive in drives)
{
    ...hacer algo...
}

 

Fuera del método estático GetDrives, y de los métodos estándares que hereda de Object y el ISerializable.GetObjectData que implementa (en efecto la clase hereda de ISerializable), no expone método alguno (quizás solo mencionar que la sobrecarga de ToString devuelve el nombre de la unidad). Pero sí tiene un conjunto de propiedades interesantes.

En primer lugar tenemos la propiedad DriveFormat. Esta nos devuelve el valor con el nombre del formato que tiene la unidad. Posibles valores son NTFS y el FAT32. Adicionalmente, tenemos la propiedad DriveType, que nos devuelve una enumeración de tipo DriveType con los siguientes posibles valores: Unknown (no se pudo determinar el tipo), NoRootDirectory (no he podido averiguar para qué sirve), Removable (la unidad es un dispositivo extraíble como un USB o un Flash), Fixed (lo contrario a Removable), Network (se trata de una unidad mapeada a un directorio en la red), CDRom (la unidad es un dispositivo óptico como una unidad de CD o de DVD) y finalmente Ram (indicando que la unidad se utiliza para memoria volátil).

Tenemos también las propiedades Name, RootDirectory y VolumeLabel, que nos devuelven el nombre de la unidad (por ejemplo, C:\, D:\, E:\, etc.), el directorio raíz (que como hablamos de una unidad de disco que por definición es raíz, prácticamente hablamos del mismo valor que la propiedad Name) y finalmente la etiqueta con la que hemos designado a nuestra unidad (los nombres son editables y pueden tener frases como “Disco personal”, “Disco de respaldo”, “CD-ROM”, etc.), respectivamente.

Con respecto al espacio y tamaño del disco, tenemos las siguientes propiedades. TotalSize devuelve el tamaño total de la unidad, en bytes. Por su parte TotalFreeSpace devuelve el espacio libre, mientras que AvailableFreeSpace devuelve el espacio libre disponible. La diferencia entre estas dos últimas es porque, por ejemplo, un disco duro puede tener 1 terabyte de espacio total, pero se comerá alrededor de 70 gigabytes para la tabla de direcciones por lo que solo estará disponible alrededor de 930 gigas. Usualmente utilizaremos AvailableFreeSpace cuando queramos ver si un archivo cabe o no en una unidad determinada.

Hay que tener un poco de cuidado, ya que las propiedades AvailableFreeSpace, DriveFormat, DriveType, TotalFreeSpace, TotalSize y VolumeLabel pueden generar una excepción de tipo IOException si la unidad produce algún error inesperado, usualmente que todavía no está disponible (por ejemplo si es un dispositivo extraíble). Para ello, siempre hay que revisar que la propiedad IsReady es true antes de llamar a estas otras propiedades, y en sistemas críticos deberíamos poner un bloque try-catch alrededor de estas llamadas.

El siguiente ejemplo muestra el empleo básico de la clase DriveInfo.

using System;
using System.IO;

...

try
{
    DriveInfo drive = new DriveInfo("C");
    if (drive.IsReady)
    {
        Console.WriteLine("Espacio disponible: {0}\n", drive.AvailableFreeSpace);
        Console.WriteLine("Formato: {0}\n", drive.DriveFormat);
        Console.WriteLine("Tipo: {0}\n", drive.DriveType);
        Console.WriteLine("Nombre: {0}\n", drive.Name);
        Console.WriteLine("Raíz: {0}\n", drive.RootDirectory);
        Console.WriteLine("Espacio total disponible: {0}\n", drive.TotalFreeSpace);
        Console.WriteLine("Tamaño total: {0}\n", drive.TotalSize);
        Console.WriteLine("Etiqueta: {0}\n", drive.VolumeLabel);
    }
    else
    {
        Console.WriteLine("La unidad \"C\" no está disponible en este momento.")
    }
} 
catch (ArgumentException e)
{
    Console.WriteLine("La unidad \"C\" no existe o es inválida. {0}", e.Message);
}
catch (IOException e)
{
    Console.WriteLine("Se ha producido un error en el sistema de entrada/salida. {0}", e.Message);
}
Categorías:.NET Framework, Apunte, C# Etiquetas:
  1. Aún no hay comentarios.
  1. abril 1, 2010 a las 1:57 am

Responder

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