This article is currently in the process of being translated into Spanish (~99% done).
File and directory information
Las clases File y Directory, las cuales hemos usado en los capítulos anteriores, son estupendos para manipulación directa de archivos y directorios. Sin embargo, a veces deseamos obtener información de ellos, y otra vez, el espacio de nombre System.IO viene al rescate. Las clases FileInfo y DirectoryInfo. En este capítulo, veremos algunas de las formas de usar estas dos clases.
La clase FileInfo
Primero, exploremos una forma simple de usar la clase FileInfo.
static void Main(string[] args)
{
FileInfo fi = new FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
if(fi != null)
Console.WriteLine(String.Format("Information about file: {0}, {1} bytes, last modified on {2} - Full path: {3}", fi.Name, fi.Length, fi.LastWriteTime, fi.FullName));
Console.ReadKey();
}
Creamos una nueva instancia de la clase FileInfo. Toma un parámetro, el cual es la trayectoria del archivo del que queremos información. Podríamos haber sólo especificado el nombre del archivo, pero para diversión, pensé que sería genial obtener información de la aplicación actual donde estamos trabajando, eso es, del archivo EXE en el que es compilado nuestro proyecto. Ya que no tenemos acceso al proyecto de la aplicación en una aplicación Consola (eso es parte del ensamble WinForms), usamos un poco de Reflexión para obtener la trayectoria del ensamble actual. Esto está totalmente fuera del alcance de este capítulo particular, pero al menos ahora usted lo sabe.
Una vez que hemos una instancia de FileInfo, retornamos toda clase de información acerce de el. Intente correr la aplicación y lo verá. Todo muy bonito y fácil, y si mira en la clase FileInfo, verá que ofrece aún más información, así como atajos a los métodos encontrados en la clase File - y ¿Por qué no? Tenemos una referencia al archivo de cualquier forma con la instancia de FileInfo, así que quizá también obtengamos la mismas opciones que en la clase File.
La clase DirectoryInfo
Ahora, la información de un solo archivo esta bién, pero usando la clase DirectoryInfo, podemos obtener información acerca de archivos y directorios en un directorio, lo cual es obviamente un escenario muy común. Permítame mostrarle con simple ejemplo:
DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
if(di != null)
{
FileInfo[] subFiles = di.GetFiles();
if(subFiles.Length > 0)
{
Console.WriteLine("Files:");
foreach(FileInfo subFile in subFiles)
{
Console.WriteLine(" " + subFile.Name + " (" + subFile.Length + " bytes)");
}
}
Console.ReadKey();
}
En vez de una instancia de FileInfo, creamos una instancia de DirectoryInfo. Usamos el mismo truco para obtener la trayectoria del archivo ejecutandose, y luego el método GetDirectoryName() de la clase Path, para obtener el parte de la trayectoria del directorio solamente. Usamos el método GetFiles() para obtener un arreglo de instancias de FileInfo, cada una representando un archivo en el directorio. Entonces ciclamos en el, desplegando cada nombre de archivo y su tamaño.
Quizá querramos los directorios también. Eso es igual de fácil:
DirectoryInfo[] subDirs = di.GetDirectories();
if(subDirs.Length > 0)
{
Console.WriteLine("Directories:");
foreach(DirectoryInfo subDir in subDirs)
{
Console.WriteLine(" " + subDir.Name);
}
}
En algunas situaciones, querrá solamente archivos o directorios con un nombre o extensión de archivo específicos. Afortunadamnete, FileInfo y DirectoryInfo tienen algún soporte muy bueno para ésto también.
Esto nos dará todos los archivos en el directorio con una extensión .exe:
FileInfo[] subFiles = di.GetFiles("*.exe");
Esto nos dará todos los directorios los cuales tienen la palabra "test" en alguna parte de su nombre:
DirectoryInfo[] subDirs = di.GetDirectories("*test*");
Podemos aún encontrar ambos archivos y directorios recursivamente, lo cual significa que buscará en subdirectorios de subdirectorios de ... del directorio original.
FileInfo[] subFiles = di.GetFiles("*.exe", SearchOption.AllDirectories);
Para solamente buscar el directorio del nivel superior, el código tendría que verse como esto:
FileInfo[] subFiles = di.GetFiles("*.exe", SearchOption.TopDirectoryOnly);
Resumen
Usando las clases FileInfo y DirectoryInfo, podemos fácilmente descubrir información acerce del sistema de archivos en la computadora actual.