Home C# - Asp.NET Monitorare una directory in C#
Monitorare una directory in C#
Programmazione & Co.
Venerdì 30 Settembre 2011 17:45

Avevo la necesità di controllare le modifiche effettuate dentro una particolare directory.

Grazie al forum.html.it sono arrivato presto alla soluzione: usare la classe FileSystemWatcher di C#.

Vediamo come usare questa classe.

Questa è la classe che mi sono creato io:

using System;
using System.Text;
using System.IO;

namespace DirectoryMonitor
{
 class DirMonitor
 {
 private string path;

 public DirMonitor(string path)
 {
 this.path = path;
 }

 public void Watcher()
 {  
 FileSystemWatcher fw = new FileSystemWatcher();
 fw.Path = path; //imposto la directory da controllare
 fw.IncludeSubdirectories = true; //includo le subdirectory
 fw.NotifyFilter = //imposto gli attributi che mi interessano
 NotifyFilters.LastAccess |
 NotifyFilters.LastWrite |
 NotifyFilters.FileName |
 NotifyFilters.DirectoryName;
//imposto gli eventi da controllare
fw.Changed += new FileSystemEventHandler(OnChanged);
 fw.Created += new FileSystemEventHandler(OnChanged);
 fw.Deleted += new FileSystemEventHandler(OnChanged);
 fw.Renamed += new RenamedEventHandler(OnRenamed);
 fw.EnableRaisingEvents = true;

 Console.WriteLine("Digita q per uscire.");
 Console.WriteLine();
 while (Console.Read() != 'q') ;
 }

 private void OnChanged(object source, FileSystemEventArgs e)
 {
 DateTime dt = new DateTime();
 dt = DateTime.UtcNow;
 Console.WriteLine("PATH " + e.FullPath + " " + e.ChangeType + " AT " + dt.ToLocalTime());
 }

 private void OnRenamed(object source, RenamedEventArgs e)
 {
 DateTime dt = new DateTime();
 dt = DateTime.UtcNow;
 Console.WriteLine("OLD PATH " + e.OldFullPath + " NEW PATH " + e.FullPath + " " + e.ChangeType + " AT " + dt.ToLocalTime());
 }
 }
}

 

Nel metodo Watcher istanzio un oggetto FileSystemWatcher che all'interno ha già parecchi metodi e propietà utili.

Quelle che ci interessano di più sono (gli altri li ho commentati brevemente):

  • NotifyFilter che imposta gli attributi che ci interessa controllare
  • gli eventi da controllare

A seconda dell'evento che si scatena richiamo uno dei due metodi sottostanti e tiro fuoti un pò di informazioni.

Notate che in verità solo Renamed richiede un evento diverso.

A questo punto nel Main dell'applicazione (che è un'applicazione console) avremo qualcosa del genere:

using System;
using System.Text;
using System.IO;

namespace DirectoryMonitor
{
 class Program
 {
 static void Main()
 {
 DirectoryInfo dr = null;
 string path = null;
 do
 {
 Console.WriteLine("Immetti il percorso di una directory:");
 path = Console.ReadLine();
 dr = new DirectoryInfo(path);
 } while (!dr.Exists);

 Console.WriteLine("-------------------------------------");
 DirMonitor dm = new DirMonitor(path);
 dm.Watcher();
 }
 }
}

L'utente immette il percorso nel do.

Fino a che la directory è sbagliata sono costretto a reinserirla (la parte while); quando è giusta istanzio la classe DirMonitor ed inizia il monitoraggio.

Ultimo aggiornamento Domenica 23 Ottobre 2011 10:34