Monitorare una directory in C#
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:
namespace DirectoryMonitor
{
class DirMonitor
{
private string path;
private DateTime dt = new DateTime();
public DirMonitor(string path)
{
this.path = path;
}
public void Watcher()
{
FileSystemWatcher fw = new FileSystemWatcher();
fw.Path = path;
fw.IncludeSubdirectories = false;
fw.NotifyFilter =
NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.FileName |
NotifyFilters.DirectoryName;
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)
{
dt = DateTime.UtcNow;
Console.WriteLine("PATH " + e.FullPath + " " + e.ChangeType + " AT " + dt.ToLocalTime());
}
private void OnRenamed(object source, RenamedEventArgs e)
{
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:
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.
Enjoy!
c# filestystemwatcher notifyfilter
Commentami!