Хобрук: Ваш путь к мастерству в программировании

Запустите другой фрагмент кода после остановки FileSystemWatcher

У меня есть код FileSystemWatcher на C#, который обнаруживает файлы, изменившие свое содержимое, а затем копирует эти файлы в указанный каталог (C:\Users\wost\Desktop\Data\files). После копирования файлов, то есть после того, как FileSystemWatcher остановился, я хочу зашифровать эти файлы и хочу сделать это в той же программе. Итак, у меня есть следующий код в основной программе:

Watcher w = new Watcher(lexpt, fexpt, userName);
w.Watch();
// Function which encrypts the files
Encryption.EncryptFiles(@"C:\Users\wost\Desktop\Data\files");

Это не работает, потому что FileSystemWatcher никогда не остановится, только если я выйду из программы. Итак, я решил использовать глобальную переменную Global.serviceRunning, как показано в приведенном ниже коде, которая останавливает FileSystemWatcher от просмотра в указанном каталоге:

public void Watch()
{
    FileSystemWatcher watcher;
    using (watcher = new FileSystemWatcher(
        $"C:\\Users\\wost\\AppData\\Roaming\\Sublime Text 3", _ext))
    {

        // Watch for changes in LastAccess and LastWrite times, and
        // the renaming of files or directories.
        watcher.NotifyFilter = NotifyFilters.LastAccess
                             | NotifyFilters.LastWrite
                             | NotifyFilters.FileName
                             | NotifyFilters.DirectoryName;

        // Only watch text files.
        // watcher.Filter = "*.txt";
        watcher.IncludeSubdirectories = true;
        // Add event handlers.
        watcher.Changed += OnChanged;
        watcher.Created += OnChanged;
        watcher.Deleted += OnChanged;
        watcher.Renamed += OnRenamed;

        // Begin watching.
        watcher.EnableRaisingEvents = true;
        //GLOBAL VARIABLE
        while (Global.serviceRunning == true) ;
    }
}

Я попытался изменить значение этой глобальной переменной на false в основной программе, но это не работает. Не могли бы вы помочь мне найти способ, как остановить FileSystemWatcher, а затем зашифровать файлы в данном каталоге?


  • FileWatcher никогда не остановится, только если я выйду из программы -- да? Почему бы вам просто не заменить EnableRaisingEvents на false? В качестве альтернативы, если вы не хотите снова использовать объект FileSystemWatcher после его отключения, просто вызовите его метод Dispose(). Конечно, такой код, как while (Global.serviceRunning == true) ;, НИКОГДА не следует использовать; это свяжет все ядро ​​процессора без всякой пользы. Но совсем не понятно, почему вы просто не используете задокументированный, нормальный механизм управления объектом FileSystemWatcher. 28.06.2021
  • @PeterDuniho Спасибо за ваш ответ! Я впервые использую FileSystemWatcher и не очень хорошо понимаю, как это работает. 28.06.2021
  • @PeterDuniho Не могли бы вы сказать мне, где мне нужно установить для EnableRaisingEvents значение false, это в основной программе или внутри метода Watch ()? Благодарю вас! 28.06.2021
  • где мне нужно установить для EnableRaisingEvents значение false — вам нужно установить его в момент выполнения вашего кода, когда вы знаете, что вам больше не нужно следить за событиями файловой системы. Вы не смогли объяснить этот аспект своего сценария в своем посте, поэтому нет возможности указать вам точное место в коде. Я сомневаюсь, что это должно идти в методе Watch(). Скорее всего, в обработчике событий, где вы знаете, что увидели то, что ожидали увидеть, и можете отключить объект FileSystemWatcher. 28.06.2021
  • @PeterDuniho Мне очень жаль. Я думал, что это ясно. Я не хочу останавливать FileSystemWatcher в определенный момент. Я просто хочу остановить его через определенное время, чтобы я мог дать ему достаточно времени для поиска изменений. Я могу это сделать? Благодарю вас! 28.06.2021
  • Отвечает ли это на ваш вопрос? хотите остановить FileSystemWatcher() после определенного период времени в C# 28.06.2021
  • Вы все еще не ясно. Есть два элемента, чтобы остановить его через определенное время. Остановить и через определенное время. К первому адресуется просто установка свойства EnableRaisingEvents. Последнее рассматривается в дубликатах вопросов и ответов предложено выше. 28.06.2021
  • @PeterDuniho Я попробовал предложение из другого вопроса, но оно у меня не сработало. Спасибо за ваше время! 28.06.2021

Ответы:


1

Вы можете попытаться отменить связанные события, чтобы остановить FileSystemWatcher.

Код:

 static void Stop()
        {
            watcher.EnableRaisingEvents = false;

            watcher.Changed -=new FileSystemEventHandler(OnChanged);
            watcher.Created -= new FileSystemEventHandler(OnChanged);
            watcher.Deleted -= new FileSystemEventHandler(OnChanged);
            watcher.Renamed -= new RenamedEventHandler(OnRenamed);
            watcher.Dispose();
        }

Я тестировал в консольном приложении.

Полный код:

class Program
    {
        static FileSystemWatcher watcher= new FileSystemWatcher();
        public static void Main(string[] args)
        {
            watcher.Path = "E:\\Example";
            watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite |
                   NotifyFilters.FileName | NotifyFilters.DirectoryName;
            watcher.Filter = "*.txt";
            watcher.Changed += new FileSystemEventHandler(OnChanged);
            watcher.Created += new FileSystemEventHandler(OnChanged);
            watcher.Deleted += new FileSystemEventHandler(OnChanged);
            watcher.Renamed += new RenamedEventHandler(OnRenamed);
            watcher.EnableRaisingEvents = true;
            Console.WriteLine("Press\'q\' to stop the watcher.");
            while (Console.ReadLine()=="q")
            {
                Stop();
            };


            Console.ReadKey();
        }

        static void Stop()
        {
            watcher.EnableRaisingEvents = false;

            watcher.Changed -=new FileSystemEventHandler(OnChanged);
            watcher.Created -= new FileSystemEventHandler(OnChanged);
          
            watcher.Deleted -= new FileSystemEventHandler(OnChanged);
            watcher.Renamed -= new RenamedEventHandler(OnRenamed);
            watcher.Dispose();
        }
        public static void OnChanged(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("file:" + e.FullPath + "" + e.ChangeType);
        }
        public static void OnRenamed(object sender, RenamedEventArgs e)
        {
            Console.WriteLine("Fi]e:{0} renamed to{1}", e.OldFullPath, e.FullPath);
        }
    }
29.06.2021

2

Как отмечали другие в комментариях, Свойство FileSystemWatcher.EnableRaisingEvents — это механизм, который следует используйте, чтобы активировать или деактивировать мониторинг целевого каталога компонентом FileSystemWatcher.

Имейте в виду, что хотя события FileSystemWatcher вызываются в ThreadPool, внутренний механизм делает невозможным вызов обработчика после деактивации компонента. Но любые уже запущенные обработчики не будут прерваны, если вы установите EnableRaisingEvents в false. Поэтому следует учитывать, что некоторые файлы могут продолжать копироваться в фоновом режиме, после момента отключения мониторинга.

28.06.2021
Новые материалы

Учебные заметки JavaScript Object Oriented Labs
Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

Разбор строк запроса в vue.js
Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
«Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..