.NET basado en eventos:use FileSystemWatcher en lugar de buscar nuevos archivos

 C Programming >> Programación C >  >> Tags >> .NET
.NET basado en eventos:use FileSystemWatcher en lugar de buscar nuevos archivos

Puede usar FileSystemWatcher para recibir notificaciones de cambios en el sistema de archivos, como cuando se crea un archivo.

Este es un ejemplo de reacción cuando se crea un archivo JSON:

FileSystemWatcher fileSysWatcher = new FileSystemWatcher(@"C:\Data\", "*.json");
fileSysWatcher.EnableRaisingEvents = true;
fileSysWatcher.Created += (sender, e) =>
{
	Console.WriteLine($"File created {e.FullPath}");
};
Code language: C# (cs)

En comparación con el sondeo, este enfoque basado en eventos con FileSystemWatcher es más eficiente y sencillo.

En el resto de este artículo, mostraré un ejemplo de cómo usar FileSystemWatcher para procesar archivos en una cola de mensajes basada en un sistema de archivos.

Ejemplo:procesamiento de nuevos archivos JSON de mensajes

Quiero implementar una cola de mensajes basada en un sistema de archivos.

Para poner en cola un mensaje, se coloca un archivo de mensaje JSON en C:\Data\MessageQueue\in\.

El procesador de la cola de mensajes recibe una notificación cuando se crea un nuevo archivo, lo procesa y luego lo quita de la cola moviéndolo a C:\Data\MessageQueue\processed\.

Así que solo quiero recibir una notificación cuando se agreguen archivos JSON a C:\Data\MessageQueue\in\.

Clase MessageQueueProcessor

Necesito crear un FileSystemWatcher que observe la carpeta C:\Data\MessageQueue\in\. Puedo hacer que solo me notifique sobre los archivos JSON especificando el filtro "*.json". Después de inicializar FileSystemWatcher, necesito suscribirme al evento Creado.

public class MessageQueueProcessor : IDisposable
{
	public const string InPath = @"C:\Data\MessageQueue\in";
	public const string ProcessedPath = @"C:\Data\MessageQueue\processed";
	private FileSystemWatcher fileSystemWatcher;


	public void Start()
	{
		fileSystemWatcher = new FileSystemWatcher(InPath, "*.json");
		fileSystemWatcher.EnableRaisingEvents = true;
		fileSystemWatcher.Created += (sender, e) =>
		{
			Console.WriteLine($"Processing enqueued file {e.FullPath}");

			var destFile = Path.Combine(@"C:\Data\MessageQueue\processed", e.Name);

			if (File.Exists(e.FullPath))
			{
				File.Move(e.FullPath, destFile);
			}
		};
	}

	public void Dispose()
	{
		if (fileSystemWatcher != null)
		{
			fileSystemWatcher.Dispose();
		}
	}

}
Code language: C# (cs)

Uso de MessageQueueProcessor

Tengo una aplicación de consola que usa MessageQueueProcessor.

static void Main(string[] args)
{
	MessageQueueProcessor messageQueueProcessor = new MessageQueueProcessor();
	messageQueueProcessor.Start();

	Console.WriteLine("Started message queue processor.");

	Console.ReadKey();
}
Code language: C# (cs)

Resultados

Tan pronto como coloco el archivo message1234.json en la carpeta de la cola de mensajes, se procesa y luego se mueve a la carpeta /procesado/.