Cómo trabajar con FileSystemWatcher en C #

La clase FileSystemWatcher en el espacio de nombres System.IO se puede usar para monitorear los cambios en el sistema de archivos. Observa un archivo o directorio en su sistema en busca de cambios y activa eventos cuando ocurren cambios.

Para que FileSystemWatcher funcione, debe especificar un directorio que necesita ser monitoreado. FileSystemWatcher genera los siguientes eventos cuando ocurren cambios en un directorio que está monitoreando.

  • Modificado: este evento se activa cuando se cambia un archivo o directorio en la ruta que se está monitoreando
  • Creado: este evento se activa cuando se crea un archivo o directorio en la ruta que se está monitoreando
  • Eliminado: este evento se activa cuando se elimina un archivo o directorio en la ruta que se está monitoreando
  • Error: este evento se activa hay un error debido a los cambios realizados en la ruta que se está monitoreando
  • Renombrado: este evento se activa cuando se cambia el nombre de un archivo o directorio en la ruta que se está monitoreando

Creación de un observador del sistema de archivos simple en C #

Creemos un nuevo proyecto de aplicación de consola en Visual Studio para demostrar cómo funciona un observador de sistema de archivos típico. Tenga en cuenta que una mejor forma de utilizar la clase FileSystemWatcher sería utilizando un servicio de Windows. Puede crear un servicio de Windows que utilice la clase FileSystemWatcher y envíe notificaciones cuando se produzcan cambios en la ruta que se está observando.

De todos modos, entremos ahora en un poco de código. En el método Main del archivo Program.cs, escriba el siguiente código.

static void Main(string[] args)

        {

            string path = @"D:\";

            MonitorDirectory(path);

            Console.ReadKey();

        }

El siguiente fragmento de código muestra cómo se vería el método MonitorDirectory. Este método se usaría para monitorear un directorio en particular y generar eventos cada vez que ocurre un cambio. La ruta del directorio se pasa como argumento al método.

private static void MonitorDirectory(string path)

        {

            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();

            fileSystemWatcher.Path = path;

            fileSystemWatcher.Created += FileSystemWatcher_Created;

            fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;

            fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;

            fileSystemWatcher.EnableRaisingEvents = true;

        }

Observe cómo se declaran los eventos y que la propiedad EnableRaisingEvents del objeto del observador del sistema de archivos se establece en true para habilitar la generación de eventos cuando se produce un cambio en la ruta que se supervisa. En esencia, esto inicia el monitoreo real: está informando a FileSystemWatcher que comience a monitorear la ruta y genere los eventos apropiados de ahora en adelante.

Para cada uno de los eventos que ha declarado, debe tener el controlador de eventos respectivo que se ejecuta cuando se activa el evento. Aquí está el código fuente de los controladores de eventos que se activarían cuando ocurra un cambio en el directorio que se está monitoreando.

 private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File created: {0}", e.Name);

        }

        private static void FileSystemWatcher_Renamed(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File renamed: {0}", e.Name);

        }

        private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File deleted: {0}", e.Name);

        }

Aquí está el código fuente completo para su referencia.

using System;

using System.IO;

namespace FileSystemWatcher

{

    class Program

    {

        static void Main(string[] args)

        {

            string path = @"D:\";

            MonitorDirectory(path);

            Console.ReadKey();

        }

        private static void MonitorDirectory(string path)

        {

            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();

            fileSystemWatcher.Path = path;

            fileSystemWatcher.Created += FileSystemWatcher_Created;

            fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;

            fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;

            fileSystemWatcher.EnableRaisingEvents = true;

        }

        private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File created: {0}", e.Name);

        }

        private static void FileSystemWatcher_Renamed(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File renamed: {0}", e.Name);

        }

        private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File deleted: {0}", e.Name);

        }

    }

}

Suponiendo que el directorio nombrado está disponible en la unidad D: \> de su sistema, ejecute la aplicación de consola y luego cree un nuevo archivo en el directorio. Observará que el nombre del archivo recién creado se muestra en la ventana de la consola. Esto se debe a que tan pronto como se crea un nuevo archivo en el directorio que se está monitoreando (D: \ en nuestro ejemplo), se activa el evento FileSystemWatcher_Created.