Главная » 2016 » Июнь » 23 » Урок №4 - Отслеживание изменений внутри папки C#
09:58
Урок №4 - Отслеживание изменений внутри папки C#

 

Лень читать? Смотри наш видеоурок на нашем канале!



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

Итак, с чего же все началось... Сказали мне на работе написать программу, которая будет работать вместе с 1С Розницей 8.1 для вывода заказов на мониторы, которые будут находится на кухне (Удобно для Фаст Фудов), подобное есть у системы R-Keeper ею и вдохновлялся :) суть программы : программа следит за изменениями в папке и при попадании в папку необходимого файла, она прогружала из него данные о продукции и выводила в блоки заказов. Сейчас мы рассмотрим момент слежения за папкой, отдельно для тестирования и исправления своих ошибок я написал программу слежения в консольном проекте со статическим путем (в основной программе этот пути записан в файл настроек).
Что нам понадобится?

 













В Visual Studio создаем проект "Консольное приложение", задаем ему имя, какой хотим и дальше пишем код.
С самого начала не забываем добавить библиотеку, иначе ничего не заработает!

 

using System.IO;

Работать мы будем с FileSystemWatcher. Далее пишем код:

static void Main(string[] args)
        {
            Run();
        }

Главная функция нашего консольного приложения это Static void Main, внутрь мы запихнули ссылку на нашу функцию слежения Run();
Теперь рассмотрим функцию Run();

public static void Run()
        {

            string gotor = "C:\\Exchange";
            
            Console.WriteLine("Всем привет! Это наше тестовое приложение для слежения за папкой :)\r\nЗаходите на наш сайт : zombievdk.ru\r\nПодписывайтесь на нашу группу : vk.com/zvdkit\r\nСледим за директорией : " + gotor);

            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = gotor;
            watcher.NotifyFilter =  NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            
            watcher.Filter = "*.*";

            watcher.Created += new FileSystemEventHandler(OnChanged);
            watcher.Deleted += new FileSystemEventHandler(OnDelete);
            watcher.Renamed += new RenamedEventHandler(OnRenamed);

            watcher.EnableRaisingEvents = true;

            Console.WriteLine("Press \'q\' to quit the programm.");
            while (Console.Read() != 'q') ;
        }

 

Теперь подробнее о том, что написано там наверху :) Итак. не будем пугаться кода, на самом деле он очень прост и легок в изучении.

string gotor = "C:\\Exchange"

Данной строкой мы задаем путь, в который будет смотреть наша программа, если данной папки не будем, то приложение просто напросто закроется.

Console.WriteLine("Всем привет! Это наше тестовое приложение для слежения за папкой :)\r\nЗаходите на наш сайт : zombievdk.ru\r\nПодписывайтесь на нашу группу : vk.com/zvdkit\r\nСледим за директорией : " + gotor);

При помощи Console.WriteLine мы просто выводит сообщение, которое означает не более чем просто приветствие :) Можно написать, что душа пожелает.

FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = gotor;
            watcher.NotifyFilter =  NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            
            watcher.Filter = "*.*";

            watcher.Created += new FileSystemEventHandler(OnChanged);
            watcher.Deleted += new FileSystemEventHandler(OnDelete);
            watcher.Renamed += new RenamedEventHandler(OnRenamed);

            watcher.EnableRaisingEvents = true;

Вот собственно основная часть нашего FileSystemWatcher, первой строчкой мы создаем нашего FSW, далее задаем ему путь в который должна смотреть программа для отслеживания изменений.
Строчкой watcher.NotifyFilter мы задаем критерии по которым программа будет отслеживать события. Ниже представлено описание с сайта MSDN

 

 

 

Имя

Описание

 

Attributes

Атрибуты файла или папки.

 

CreationTime

Время создания файла или папки.

 

DirectoryName

Имя каталога.

 

FileName

Имя файла.

 

LastAccess

Дата последнего открытия файла или папки.

 

LastWrite

Дата последней записи в файл или папку.

 

Security

Параметры безопасности файла или папки.

 

Size

Размер файла или папки.

Далее мы указываем тип файла за которыми мы хотим следить watcher.Filter = "*.*" - такое написание означает, что программа отслеживает абсолютно любой тип файла с любым расширением, если мы укажем : *.zip, то программа будет отслеживать события только с .zip архивами, если нас интересует файл, который начинается с определенных символов, то указываем: file*.* Так он будет отслеживать все файлы, имя которых начинается с "file".
Следующими строчками мы описываем события за которыми следим и на которые программа будет реагировать.
watcher.Created += new FileSystemEventHandler(OnChanged) - Событие которое произойдет при создании нового файла. Как мы видим строчка вызывает функцию OnChanged, давайте посмотрим на её написание:

private static void OnChanged(object source, FileSystemEventArgs e)
        {
            Console.WriteLine("New File is : " + e.Name + " \r\nAnd type : " + e.ChangeType + " \r\nPath of file : " + e.FullPath + "\r\n");
        }


При создании нового объекта в папке в консоль будет выведено сообщение со следующими строчками : Имя файла, действие производимое над файлом, Путь до файла. Выглядит это следующим образом :


 

Следующее наше событие - это watcher.Renamed += new RenamedEventHandler(OnRenamed) - происходит оно при переименовании файла. Функция OnRenamed :

 private static void OnRenamed(object source, RenamedEventArgs e)
        {
            Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
        }

В дальнейшем внутри этих функций уже можно делать, все что Вам вздумается, это может быть копирование файла в другую папку или просто переименование файла сразу после его создания, возможности ограничиваются Вашими фантазиями! В моем случае программа лезла внутрь файла, так как предполагалось, что в папке попадают только текстовые файлы и писала что делать дальше с файлом, так как 1С создает изначально файлы .tmp, то событие Created уже не видела файла, но его видело событие Renamed.


 

Последнее наше событие, это событие удаления watcher.Deleted += new FileSystemEventHandler(OnDelete) - Событие которое произойдет при удалении файла из папки. Теперь посмотрим на функцию OnDelete :

 private static void OnDelete(object source, FileSystemEventArgs e)
        {
            Console.WriteLine("Delete File : " + e.Name + "\r\nFile Action : " + e.ChangeType + "\r\nDelete File from path : " + e.FullPath + "\r\n");
        }

При удалении объекта в папке в консоль будет выведено сообщение со следующими строчками : Имя файла, действие производимое над файлом, Путь до файла. Выглядит это примерно как с предыдущей функцией, но при других условиях :

 

 

Категория: Уроки по C# | Просмотров: 3586 | Добавил: bowxdlal
Всего комментариев: 0
avatar