lunes, 20 de julio de 2015

Receta C# No. 5-19: Monitorización de Cambios en un Sistema de Archivos

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Generalidades
3.2 Clase FileSystemWatcher
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Haremos algo muy interesante en esta receta C# número 19: monitorizar los cambios realizados sobre un sistema de archivos: creación, renombramiento, eliminación, modificación. Este tipo de monitorización resulta útil para aplicaciones y procesos de negocio que se activan una vez se detecta la creación de un archivo, o cambios efectuados sobre archivos existentes. Estudiáremos la clase FileSystemWatcher que ofrece la funcionalidad para detectar cambios en un sistema de archivos.

1. Problema

Debemos monitorizar los cambios en un sistema de archivos y ejecutar operaciones de acuerdo al evento (e.g., modificación, creación, eliminación) generado.

2. Solución

La clase FileSystemWatcher (System.IO) permite especificar una ruta a monitorizar y ejecutar operaciones asociadas a eventos de archivos.

3. Discusión de la Solución

3.1 Generalidades

La monitorización de un sistema de archivos es una tarea común en cierto tipo de aplicaciones y procesos de negocio, donde una vez se detecte un cambio en una o varias rutas del sistema de archivos se disparan acciones para reaccionar a esos cambios. Esta monitorización se puede llevar a cabo de dos maneras:
  • Escaneo periódico. Este enfoque resulta útil cuando se requiere una constante monitorización sobre el sistema de archivos. Sin embargo es costoso a nivel de recursos.
  • Escaneo con temporizador. Este tipo de enfoque tiene en consideración los recursos (e.g., tiempo de procesador y espacio de memoria), sin embargo la detección de cambios puede retrasarse debido a que el escaneo se realiza cada cierto período.
La solución al trade-off de los dos enfoques anteriores es recurrir a eventos de archivos de Windows [1]. Para ello debemos utilizar la clase FileSystemWatcher.

3.2 Clase FileSystemWatcher

La clase FileSystemWatcher [2] está diseñada para escuchar la notificaciones generadas por el sistema de archivos y lanzar eventos cuando se detecten cambios en directorios y archivos.

Entre las propiedades sobresalientes de esta clase tenemos:
  • Path: ruta a monitorizar, 
  • Filter: tipos de archivos a monitorizar, 
  • NotifyFilter: tipos de cambios a monitorizar.
Y los eventos clave a los que reacciona:
  • Created
  • Deleted
  • Renamed, y 
  • Changed.
Ejemplo de uso:

En las línea 27 validamos el número de argumentos pasados desde la línea de comandos por parte del usuario. Sobre la línea 34 creamos un objeto FileSystemWatcher . Asignamos el directorio a monitorizar: monitor.Path = args[1];.


Con la propiedad NotifyFilter (línea 40) especificamos los tipos de cambios a monitorizar. Los valores asignados se realizan con la operación bitwise y la enumeración NotifyFilters [3].

Más adelante, línea 44, especificamos los tipos de archivos a monitorizar; en este caso todos los archivos con extensión .txt.


Adicionamos los manejadores de eventos (líneas 47-50). Y damos inicio a la monitorización con: 

monitor.EnableRaisingEvents = true;


La aplicación no se detiene hasta que el usuario presione la tecla q.

Compilación: 


  1. csc /target:exe Monitor.cs

Ejecución assembly


  1. .\Monitor.exe


> Prueba de ejecución:
Ejecución assembly Monitor.exe
Animación 1. Ejecución assembly Monitor.exe.

4. Práctica: Código C#

A continuación un ejemplo práctico para afianzar nuestro conocimiento de la clase FileSystemWatcher:

Crearemos una aplicación consola que monitoriza la creación y eliminación de un archivo. El usuario simplemente presiona la tecla Enter para continuar con una operación: creación y eliminación.

Con la sentencia using creamos un objeto FileSystemWatcher (línea 16). Asignamos la ruta a monitorizar con: 

monitor.Path = Application.StartupPath;


Luego, línea 22, indicamos que se debe monitorizar todo tipo de archivo. Además, se deben monitorizar todos los subdirectorios:

monitor.IncludeSubdirectories = true;


Establecemos el manejador de eventos para la creación y eliminación de archivo (líneas 28 y 29):

monitor.Created += new FileSystemEventHandler(OnCreatedODeleted);
monitor.Deleted += new FileSystemEventHandler(OnCreatedODeleted);


Habilitamos el inicio de la monitorización (línea 32):

monitor.EnableRaisingEvents = true;

El usuario deberá presionar Enter para crear y eliminar el archivo. Cuando esto suceda se mostrará un mensaje de notificación en la salida estándar.

Compilación:


  1. csc /target:exe MonitorCreacionEliminacionArchivo.cs

Ejecución assembly:


  1. .\MonitorCreacionEliminacionArchivo.exe

> Prueba de ejecución:
Ejecución assembly MonitorCreacionEliminacionArchivo.exe
Animación 2. Ejecución assembly MonitorCreacionEliminacionArchivo.exe.

5. Conclusiones

Hemos comprendido los básicos para la monitorización de cambios en un sistema de archivos. Conocimiento útil para ser utilizado en aquellas aplicaciones o procesos de negocios que interactúan cuando se genera un cambio en archivos y directorios. La clase FileSystemWatcher definitivamente ofrece esta funcionalidad de forma intuitiva.


En la próxima receta C# veremos cómo acceder a un puerto COM.

6. Glosario

  • Archivo
  • Bitwise
  • Clase
  • Directorio
  • Evento
  • Manejador de evento
  • Monitorizar
  • Proceso de negocio
  • Usuario

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]: FileSystemWatcher Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx
[3]: NotifyFilters Enumeration (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.notifyfilters(v=vs.110).aspx


V

No hay comentarios:

Publicar un comentario

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