ZombieVDK

Март 10 Автор 
Опубликовано в Уроки по C#

Урок №4 - FileSystemWatcher

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

Лень читать? Смотри на YouTube!

Итак, с чего же все началось... Сказали мне на работе написать программу, которая будет работать вместе с 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 мы задаем критерии по которым программа будет отслеживать события.
Далее мы указываем тип файла за которыми мы хотим следить 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");
}
При удалении объекта в папке в консоль будет выведено сообщение со следующими строчками : Имя файла, действие производимое над файлом, Путь до файла. Выглядит это примерно как с предыдущей функцией, но при других условиях :
BLOG COMMENTS POWERED BY DISQUS
18 Последнее изменение Пятница, 10 Март 2017
ZombieVDK Admin

Администратор портала zombievdk.ru