Как да работя с FileSystemWatcher в C #

Класът FileSystemWatcher в пространството от имена System.IO може да се използва за наблюдение на промените във файловата система. Той наблюдава файл или директория във вашата система за промени и задейства събития, когато настъпят промени.

За да работи FileSystemWatcher, трябва да посочите директория, която трябва да се следи. FileSystemWatcher повдига следните събития, когато настъпят промени в директория, която тя наблюдава.

  • Променено: Това събитие се задейства, когато се променя файл или директория в наблюдавания път
  • Създадено: Това събитие се задейства, когато се създаде файл или директория в наблюдавания път
  • Изтрито: Това събитие се задейства, когато файл или директория в наблюдавания път се изтрият
  • Грешка: Това събитие се задейства, има грешка поради промени, направени в наблюдаваната пътека
  • Преименувано: Това събитие се задейства, когато файл или директория в наблюдавания път се преименува

Създаване на прост наблюдател на файлова система в C #

Нека създадем нов проект за конзолно приложение в Visual Studio, за да демонстрираме как работи типичен наблюдател на файлова система. Имайте предвид, че по-добър начин за използване на класа FileSystemWatcher би бил използването на услуга на Windows. Можете да създадете услуга на Windows, която използва класа FileSystemWatcher и изпраща известия, когато и когато настъпят промени в гледания път.

Както и да е, нека сега да влезем в малко код сега. В основния метод на файла Program.cs напишете следния код.

static void Main(string[] args)

        {

            string path = @"D:\";

            MonitorDirectory(path);

            Console.ReadKey();

        }

Следният кодов фрагмент показва как би изглеждал методът MonitorDirectory. Този метод ще се използва за наблюдение на определена директория и събиране на събития, когато настъпи промяна. Пътят на директорията се предава като аргумент на метода.

private static void MonitorDirectory(string path)

        {

            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();

            fileSystemWatcher.Path = path;

            fileSystemWatcher.Created += FileSystemWatcher_Created;

            fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;

            fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;

            fileSystemWatcher.EnableRaisingEvents = true;

        }

Обърнете внимание как са декларирани събитията и че свойството EnableRaisingEvents на обекта на наблюдател на файлова система е зададено на true, за да се даде възможност за събиране на събития, когато настъпи промяна в наблюдавания път. По същество това стартира действителното наблюдение - вие информирате FileSystemWatcher да започне да наблюдава пътя и да издава съответни събития занапред.

За всяко от събитията, които сте декларирали, трябва да имате съответния манипулатор на събития, който се изпълнява при задействане на събитието. Ето изходния код на манипулаторите на събития, който би се задействал, когато и когато настъпи промяна в директорията, която се наблюдава.

 private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File created: {0}", e.Name);

        }

        private static void FileSystemWatcher_Renamed(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File renamed: {0}", e.Name);

        }

        private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File deleted: {0}", e.Name);

        }

Ето пълния изходен код за справка.

using System;

using System.IO;

namespace FileSystemWatcher

{

    class Program

    {

        static void Main(string[] args)

        {

            string path = @"D:\";

            MonitorDirectory(path);

            Console.ReadKey();

        }

        private static void MonitorDirectory(string path)

        {

            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();

            fileSystemWatcher.Path = path;

            fileSystemWatcher.Created += FileSystemWatcher_Created;

            fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;

            fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;

            fileSystemWatcher.EnableRaisingEvents = true;

        }

        private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File created: {0}", e.Name);

        }

        private static void FileSystemWatcher_Renamed(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File renamed: {0}", e.Name);

        }

        private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File deleted: {0}", e.Name);

        }

    }

}

Ако приемем, че посочената директория е налична на D: \> устройството на вашата система, стартирайте конзолното приложение и след това създайте нов файл в директорията. Ще забележите, че името на новосъздадения файл се показва в прозореца на конзолата. Това е така, защото веднага щом се създаде нов файл в наблюдаваната директория (D: \ в нашия пример), се задейства събитието FileSystemWatcher_Created.