Home / Programmazione / C# - Asp.NET / Monitorare una directory in C#
Mattepuffo

Monitorare una directory in C#

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!