domingo, 5 de julio de 2015

Receta C# No. 5-2: Asignación de Atributos a Directorios y Archivos

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 La propiedad Attributes
3.2 Aritmética bitwise (bit a bit) para asignación de atributos
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Segunda receta C# de la serie de artículos centrados en la manipulación de archivos y directorios. En esta oportunidad, conoceremos el proceso requerido para asignar atributos a un directorio o un archivo: Sólo lectura, oculto, archivo compreso, temporal, encriptado, entre otros. Veremos, inclusive, cómo las operaciones bitwise nos ayudan a establecer o asignar estos atributos de forma sencilla y efectiva. ¡Empecemos!

1. Problema

Requerimos conocer un método prográmatico por medio del lenguaje de programación C# para establecer o asignar los atributos (e.g., sólo lectura, oculto, archivo compreso, temporal, encriptado) a archivos y carpetas.

2. Solución

Entre las propiedades interesantes que proveen las clases System.IO.FileInfo y System.IO.DirectoryInfo se encuentra Attributes. Con esta propiedad el programador puede cambiar los atributos de un directorio o archivo aplicando operaciones bitwise (bit a bit) con los operadores AND (&) y OR (|)  sobre sí misma y usando combinaciones de la enumeración FileAttributes.

3. Discusión de la Solución

3.1 La propiedad Attributes

La propiedad Attributes de las clases FileInfo [2] y DirectoryInfo [3] es heredada directamente de la clase base FileSystemInfo (namespace System.IO). Su firma es:

public FileAttributes Attributes { get; set; }

Recupera y establece valores de la enumeración FileAttributes [5] (namespace System.IO). Los posibles valores de recuperación y establecimiento (asignación) para esta propiedad se muestran en la Tabla 1 [5].
Lista valores enumeración FileAttributes
Tabla 1. Lista valores enumeración FileAttributes.
Escribamos un ejemplo de uso:


En la línea 12 creamos una instancia de FileInfo para conocer las propiedades del archivo ArchivoTexto.txt. Usamos la propiedad Attributes sobre el objeto FileInfo recién creado para recuperar el conjunto de atributos actuales del archivo ArchivoTexto.txt. Ya sobre la línea 18 comprobamos si el archivo en cuestión es de sólo lectura (para este caso asumimos que el archivo es de escritura inicialmente).


Más adelante, en la línea 24 cambiamos el archivo a sólo lectura:

archivo.Attributes = FileAttributes.ReadOnly;

y finalmente con una llamada al método ComprobarSoloLectura (líneas 34-45) consultamos por el estado actual de lectura del archivo.

Compilación:


  1. csc /target:exe UsoFileAttributes.cs

Ejecución assembly:


  1. .\UsoFileAttributes.exe

> Prueba de ejecución (local):
Ejecución assembly UsoFileAttributes.exe
Figura 1. Ejecución assembly UsoFileAttributes.exe.

3.2 Aritmética bitwise (bit a bit) para asignación de atributos

La aritmética bitwise resulta muy interesante y útil cuando trabajamos con enumeraciones, y en este caso su utilidad reside en el establecimiento de propiedades a archivos o carpetas. Asumamos que deseamos cambiar las propiedades el archivo ArchivoTexto.txt a sólo lectura (read only) y oculto (hidden); lo que tenemos que hacer es lo siguiente:

archivo.FileAttributes = FileAttributes.ReadOnly | FileAttributes.Hidden;

Notemos el uso del operador bitwise OR (|) entre los datos valores de la enumeración FileAttributes. Con ello estamos diciendo: "Asigne la propiedad ReadOnly, y Hidden, inclusive al archivo `ArchivoTexto.txt`".

[No me extenderé más en esta subsección. El lector interesado y motivado puede seguir este artículo Enumeraciones en C# - Parte 3.]

4. Práctica: Código C#

Creemos un ejemplo más para subrayar la importancia del buen uso de las operaciones bitwise en la consulta de atributos de un archivo.


En la línea 22 de la sentencia if debemos ser cuidadosos, pues aquí estamos confundiendo el modo en que se debe comparar los atributos asignados al archivo. NO debemos realizar la comparación usando el operador de igualdad ==, sino usando los operadores bitwise AND (&) y OR (|). La forma correcta es la que se efectúa en la línea 29:

if ((archivo.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)


Con el operador AND (&) simplemente estamos diciendo que se opere a nivel de bits los valores localizados en archivo.Attributes y FileAttributes, si después de operar binariamente obtenemos una representación igual (==) al valor de FileAttributes, entonces hemos comprabado si el archivo es de sólo lectura o no.

Compilación:


  1. csc /target:exe UsoCorrectoBitwise.cs

Ejecución assembly:


  1. .\UsoCorrectoBitwise.exe

> Prueba de ejecución (local):
Ejecución assembly UsoCorrectoBitwise.exe
Figura 2. Ejecución assembly UsoCorrectoBitwise.exe.

5. Conclusiones

Comprendimos cómo obtener el listado de atributos de un archivo (ejemplo de la sección 4) y cómo modificar la propiedad de sólo lectura (ejemplo sección 3.2). La propiedad Attributes de las clases FileInfo y DirectoryInfo nos permite obtener y asignar atributos de acuerdo con las operaciones bitwise permitadas en C#: AND (&) y OR (|). También hicimos énfasis en el uso correcto de las operaciones bitwise para distinguir la diferencia entre el operador de igualdad (==) y los operadores bitwise. La próxima receta será muy interesante: aprenderemos a copiar, mover, y eliminar archivos y directorios.

6. Glosario

  • Archivo
  • Atributo
  • Bit a bit
  • Bitwise
  • Directorio

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]: DirectoryInfo Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.directoryinfo.aspx
[4]: FileSystemInfo Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.aspx
[5]: Enumeraciones en C# - Parte 3 - http://ortizol.blogspot.com/2014/05/enumeraciones-en-c-parte-3.html


J

No hay comentarios:

Publicar un comentario

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