csharp-directory-watcher

Detecta cambios en ficheros y directorios en C# DirectoryWatcher

La biblioteca de C# DirectoryWatcher es una implementación Open Source de alto rendimiento que nos permite detectar en tiempo real cambios en ficheros y directorios.

Esta biblioteca es una alternativa a la clase FileSystemWatcher de .NET. Así DirectoryWatcher presenta mejoras importantes en ciertas limitaciones que tiene la biblioteca nativa.

La primera diferencia es que la clase nativa únicamente informa de modificaciones en los ficheros. Mientras que DirectoryWatcher notifica de los eventos que ocurren tanto en ficheros como carpetas.

En concreto, los eventos a los que podemos sindicarnos con DirectoryWatcher permite son los siguientes.

  • Renombrado fichero o carpeta
  • Borrado fichero o carpeta
  • Creado fichero o carpeta

Otro mejora importante es que DirectoryWatcher intenta eliminar los eventos duplicados. Mientras que el FileSystemWatcher suele generar varias veces el mismo evento (sobre todo en la eliminación).

Además DirectoryWatcher gestiona mejor las excepciones y errores, ya que el sistema nativo es propenso a generar errores que te cierran por completo la aplicación.

Por último, DirectoryWatcher gestiona mejor unidades o volúmenes grandes, soporta ficheros UNC/Unix. En general, es bastante más eficiente y robusto que el método nativo.

Cómo usar DirectoryWatcher

Podemos añadir la biblioteca a un proyecto de .NET fácilmente, a través del paquete Nuget correspondiente.

Install-Package MyOddWeb.DirectoryWatcher

El uso de “DirectoryWatcher” es bastante sencillo. Puedes crear una instancia de la clase DirectoryWatcher y suscribirte a los eventos que desees monitorear.

using( var watch = new Watcher() )
{
  watch.Add(new Request("C:\\Directorio_a_monitorizar", true));
  watch.Add(new Request("d:\\foo\\bar\\", true));
  watch.Add(new Request("y:\\", true));
	
	watcher.Changed += (sender, e) =>
	{
	    Console.WriteLine($"Archivo modificado: {e.FullPath}");
	};
	
	watcher.Created += (sender, e) =>
	{
	    Console.WriteLine($"Archivo creado: {e.FullPath}");
	};
	
	watcher.Deleted += (sender, e) =>
	{
	    Console.WriteLine($"Archivo eliminado: {e.FullPath}");
	};
	
	watcher.Renamed += (sender, e) =>
	{
	    Console.WriteLine($"Archivo renombrado: {e.OldFullPath} -> {e.FullPath}");
	};
	
	watcher.Error += (sender, e) =>
	{
	    Console.WriteLine($"Error: {e.GetException().Message}");
	};

watcher.Start();

En este ejemplo, creamos una instancia de DirectoryWatcher y especificamos el directorio que deseamos monitorear. A continuación, nos suscribimos a los diferentes eventos que queremos gestionar, como Changed, Created, Deleted y Renamed.