sábado, 4 de julio de 2015

Receta C# No. 5-1: Obtener la Información Acerca de un Archivo, Directorio, o Unidad

Índice

0. Introducción
0.1 Introducción serie de recetas de archivos, directorios, y entrada y salida
0.2 Introducción receta
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Clase FileInfo
3.2 Clase DirectoryInfo
3.3 Clase DriveInfo
3.4 Notas finales
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

0.1 Introducción serie de recetas de archivos, directorios, y entrada/salida

Sabemos que el Framework .NET de Microsoft cuenta con una infraestructura de elementos software que integran la base para la creación de nuevas aplicaciones software de una robustez inigualable. En particular, y en lo que respecta a clases de entrada y salida, .NET ofrece capacidades poderosas y efectivas para la gestión de archivos, directorios y flujos de entrada y salida. En esta nueva serie de recetas concentraremos nuestra energía mental en comprender los elementos de programa que permiten este tipo de manipulaciones. Veremos dos grandes cateogrías:
  1. La primera, y la más básica, nos sirve para obtener información del sistema de archivos y realizar operaciones sobre archivos y carpetas (e.g., copiar archivos y mover directorios). Las clases FileInfo y DirectoryInfo nos serán imprescendibles para este tipo de tareas.
  2. La segunda categoría, y seguramente la más importante, concibe el manejo de flujos a través de sofisticadas clases de la BCL para leer y escribir datos desde cualquier flujo de fuente o de destino: archivos binarios, archivos de texto, conexión de red, memoria de buffer.
Ya concluiremos que el grado de abstracción que nos ofrece estas clases, nos permite interactuar de modo homogéneo y consistente con recursos relacionados con flujos o streams. En parte, este es el poder que entrega .NET al programdor disciplinado para construir aplicaciones robustas, seguras, consistentes, y trascendentales.

0.1 Introducción Receta

En esta primera receta de la quinta serie de Recetas C#, vamos a estudiar cómo obtener la información de un archivo, directorio, o unidad de disco usando tres clases de la BCL: System.IO.FileInfo, System.IO.DirectoryInfo, y System.IO.DriveInfo. Se incluirá una tabla con los miembros más importantes de archivos, directorios, y unidades de disco. ¡Manos a la obra!

1. Problema

Se requiere obtener la información de un archivo de usuario o aplicación, directorio, o una unidad.

2. Solución

La BCL del Framework .NET provee las clases:
  • System.IO.FileInfo
  • System.IO.DirectoryInfo, y 
  • System.IO.DriveInfo
Con estas tres clases podemos obtener la información acerca de archivos, directorios y unidades.

3. Discusión de la Solución

Antes de estudiar las tres clases mencionadas para la solución a nuestro problema, pasaremos por reconocer los miembros más importantes de archivos, directorios, y unidades. La Tabla 1 [1] enlista estos miembros bajo estas características: Miembro, Aplicación, y una breve descripción de uso.
Miembros claves de archivos, directorios, y unidades de disco
Figura 1. Miembros claves de archivos, directorios, y unidades de disco [1].

3.1 Clase FileInfo

La clase FileInfo [2] (namespace System.IO) provee miembros para crear, copiar, eliminar, mover, y abrir archivos. Como se menciona en [2], FileInfo es fundamental para la creación de objetos FileStream (los cuales estudiáremos más adelante en recetas o artículos C#).

Continuando, varios de los métodos que provee FileInfo permiten crear o abrir otros tipos de entrada y salida. Estos tipos permiten manipular los archivos para escribir o leer datos. Por otra parte, es importante mencionar que esta clase está diseñada para realizar un trabajo más eficiente cuando ejecutamos múltiples operaciones sobre un mismo archivo; es por eso, que en [1] se desconseja el uso de los métodos estáticos de la clase File [6], debido a que ésta requiere de monitoreo de seguridad constantemente.

Ejemplo de Uso:


Algunas de las operaciones que realizamos con una instancia de la clase FileInfo:
  • Línea 12: Creación de una instancia FileInfo. El constructor [3] recibe como argumento una cadena de caracteres que corresponde con la ruta relativa para el archivo UsoFileInfo.cs.
  • Línea 15: Se valida que el archivo UsoFileInfo.cs exista. De ser así se mostrará información variada sobre este archivo:
    • Líneas 19-24: Se muestra la hora de creación, la extensión, el nombre completo (ruta absoluta), si el archivo es lectura o no, tamaño en bytes, y el nombre del archivo.
Compilación:

  1. csc /target:exe UsoFileInfo.cs

Ejecución assembly:


  1. .\UsoFileInfo.exe

> Prueba de ejecución:
Ejecución assembly UsoFileInfo.exe
Figura 2. Ejecución assembly UsoFileInfo.exe.

3.2 Clase DirectoryInfo

La clase DirectoryInfo [4] (namespace System.IO) provee operaciones para mover, crear, y enumerar directorios y subdirectorios. Esta clase al igual que FileInfo, no permite crear subclases de sí.

Esta clase más apropiada para operaciones recurrentes sobre un objeto que la clase Directory [5].

Ejemplo de uso:


Algunas operaciones importantes sobre este ejemplo de uso:
  • Línea 13: Creación de una instancia de DirectoryInfo con la ruta absoluta del directorio Cap04. Notemos que el cáracter de barra decreciente, \ debe ir precedido por \. Podemos omitir el uso del cáracter de escape \ por medio del cáracter verbatim @ [7]:

    ... DirectoryInfo(@"A:\C#\VisualCSharp2010Recipes\Cap04");
  • Línea 21: Usamos el método GetDirectories [8] para obtener un arreglo de objetos DirectoryInfo que corresponde con el listado de subdirectorios contenidos en el directorio Cap04.
  • Líneas 24-26: Enlista los subdirectorios de Cap04 a través de un ciclo foreach.
Compilación:


  1. csc /target:exe UsoDirectoryInfo.cs

Ejecución assembly:


  1. .\UsoDirectoryInfo.exe

> Prueba de ejecución:
Ejecución assembly UsoDirectoryInfo.exe
Figura 2. Ejecución assembly UsoDirectoryInfo.exe.

3.3 Clase DriveInfo

La clase DriveInfo [9] permite obtener información acerca de las unidades de disco locales y de red. La firma de esta clase:


public sealed class DriveInfo : ISerializable


evidencia que no se pueden crear subclases (está marcada con la construcción sintáctica sealed), esto mismo aplica para FileInfo, y DirectoryInfo


Ejemplo de uso:

Archivo C# UsoDriveInfo.cs [Enlace alternativo]:



En la línea 13 usamos el método static GetDrives [10] para obtener el conjunto de unidades disponibles en el sistema. Iteramos este arreglo de objetos DriveInfo con el ciclo foreach de las líneas 16-25. La información a mostrar por unidad comprende:
  • Letra de unidad, 
  • Formato de unidad (e.g., NTFS, FAT32), y
  • Nombre de volumen.
Compilación:


  1. csc /target:exe UnicaInstanciaAplicacion.cs

Ejecución assembly:


  1. .\UnicaInstanciaAplicacion.exe

> Prueba de assembly:
Ejecución assembly UsoDriveInfo.exe
Figura 3. Ejecución assembly UsoDriveInfo.exe.

3.4 Notas finales

Notas o apuntes a tener en cuenta a la hora de trabajar con estas tres clases:
  • Las clases FileInfo y DirectoryInfo heredan de la clase abstracta FileSystemInfo. Esta clase define miembros comunes como: CreationTime, Exists, entre otros. La clase DriveInfo no posee la misma jerarquía de herencia.
  • El método Refresh actualiza las valores de las propiedades de objetos de las clases FileInfo y DirectoryInfo.
  • Las clases FileInfo y DirectoryInfo pueden generar las excepciones FileNotFoundException, y DirectoryNotFoundException respectivamente; por lo tanto debemos tener cuidado con mantener nombres bien formados tanto para archivos y directorios.

4. Práctica: Código C#

Ejemplo práctico final en el que crearemos una aplicación que recibe como entrada un nombre de archivo y consulta sus propiedades, el directorio en el que está contenido, además detalles de la unidad que está contenido.

Archivo C# PropiedadesArchivoDirectorio.cs [Enlace alternativo]:


Podemos comprender las operaciones efectuadas en cada una de las líneas de este ejemplo recurriendo a los ejemplos de uso presentandos en la sección número 3; por esta razón, omito la descripción en este ejemplo.

Compilación:


  1. csc /target:exe PropiedadesArchivoDirectorio.cs

Ejecución assembly:


  1. .\PropiedadesArchivoDirectorio.exe

> Prueba de ejecución:
Ejecución assembly PropiedadesArchivoDirectorio.exe
Figura 4. Ejecución assembly PropiedadesArchivoDirectorio.exe.

5. Conclusiones

Hemos trabajado con las clases FileInfo, DirectoryInfo, y DriveInfo para conocer información acerca de archivos, directorios, y unidades. Este conocimiento nos será de importante utilidad cuando requerimos trabajar con flujos de distintas fuentes o destinos: archivo binario o de texto, por ejemplo. En recetas posteriores trabajaremos con la asignación de atributos de archivos y directorios, y operaciones como copiar, mover, y eliminar este tipo de recursos.

6. Glosario

  • .NET
  • Archivo
  • BCL
  • Directorio
  • Flujo
  • Stream
  • Unidad

7. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: FileInfo Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.fileinfo(v=vs.110).aspx
[3]: FileInfo Constructor (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.fileinfo.fileinfo(v=vs.110).aspx
[4]: DirectoryInfo Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.directoryinfo.aspx
[5]: Directory Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.directory(v=vs.110).aspx
[6]: File Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.file(v=vs.110).aspx
[7]: Caracteres y Cadenas de Caracteres en C# - Parte 2 - http://ortizol.blogspot.com/2013/08/caracteres-y-cadenas-de-caracteres-en-c_29.html
[8]: DirectoryInfo.GetDirectories Method (System.IO) - https://msdn.microsoft.com/en-us/library/s7xk2b58.aspx
[9]: DriveInfo Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.driveinfo(v=vs.110).aspx
[10]: Clases y Funciones Selladas en C# - http://ortizol.blogspot.com/2014/01/clases-y-funciones-selladas-en-c.html
[11]: DriveInfo.GetDrives Method (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.driveinfo.getdrives(v=vs.110).aspx


J

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.