ZombieVDK

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

Урок №6 - FileSystemWatcher пишем программу слежения и работу с файлами (Часть 1)

Оцените материал
(0 голосов)
Comment
Привет мои читатели! Сегодня я Вам расскажу как можно применить FileSystemWatcher на практике, будет всего пара примеров, таких как :
  • Программа отслеживает текстовые файлы и выводит их содержимое в RichTextBox. ( + Обработка строк)
  • Программа отслеживает все файлы и копирует их в другую папку.

Лень читать? Смотри на нашем канале! Обязательно подпишись!

Вот таких 2 простых примера мы сегодня рассмотрим на практике, чтобы было понимание для чего же нужен FileSystemWatcher, а также познакомимся немного с потоками. К чему это я о потоках? Дело в том, что FileSystemWatcher ведет обработку в другом потоке, что не дает нам использовать его данные вне его функций, но тут к нам на помощь приходит Invoke, которым мы и будем пользоваться при работе с данными файлов.
ВНИМАНИЕ! ВОЗМОЖЕН КРИВОЙ КОД!
Проблемы с которыми мы столкнемся при работе :
  • Изначально файлы создаются как временные, а потом уже имеют нормальный вид, при копировании такого эффекта не происходит. В чем тут трудность? Как мы помним из Урока №5, то просто событие OnChanged не видит эти файлы, но за то их замечает событие OnRenamed, в прочем код будет и там и там написано примерно одинаковый (Я сейчас про копирование и чтение из файла)
  • Работа с потоками. Иногда при чтении файла бывает такая штука, что файл занимается каким либо потоком и не может получить доступ к нему, тут будем извиваться :)

Для чего мне нужен этот проект?


Он задумывается как просто маленькая программа, которая бы копировала из папки в папку бэкапы SQL баз ( Вы скажете : Зачем тебе велосипед? А как же кобиан!? Есть же много подобного софта и блаблабла!). Действительно, софта очень много и он весь разнообразный, но кобиан в нашем домене не могет копировать файлы, поэтому раньше этим занимался RoboCopy. Итак, начнем мы с того, что будем производить копирование файла и вывод его имени где-нибудь на окне программы (Label, Textbox);
Приступим... С самого начала мы создаем форму и прикручиваем к ней разные элементы управления :
После того, как мы раскидали наши элементы по форме мы приступаем к кодингу. Добавляем библиотеки, необходимые нам для работы :
using System.IO; using System.Threading;
Программа выполнена также на .Net Framework 3.5. Первым делом Я создавал функцию, которая называется preloader(); и нужна она для того, чтобы заполнить программу настройками. (в данном случае в файле настроек будут храниться пути "Откуда" и "Куда" копировать и ещё пара настроек, он они уже больше для расширения функционала, пока они нас не интересуют. Давайте рассмотрим эту функцию :
public void preloader()
{
string prel;
using (FileStream f = new FileStream(Application.StartupPath + "\\setTWT.ini", FileMode.Open))
using (StreamReader sr = new StreamReader(f, Encoding.Default))
while ((prel = sr.ReadLine()) != null)
{
if (prel.Contains("$"))
{
string edit = prel.Trim(ExcludeSymbolSettings);
pathfrom = edit;
frombx.Text = pathfrom;
}
if (prel.Contains("#"))
{
string edit1 = prel.Trim(ExcludeSymbolSettings);
pathto = edit1;
tobx.Text = pathto;
}
}
}
Наша функция preloader(); делает следующее :
  • Сначала мы обозначаем переменную типа string 'prel'
  • После чего при помощи FileStream и StreamReader мы открываем наш файл с настройками
  • В цикле мы смотрим нужные нам строчки ( Первое условие ищет строку с символом $, этот символ является ключом к нашему пути откуда копировать и внутри условия мы производим обработку строки и убираем лишние символы для этого мы в самом начале нашего кода сделали запись с символами (см. ниже) делается это строчкой : string edit = prel.Trim(ExcludeSymbolSettings); )
  • После этого мы имеем загруженные настройки в нашу программу.
Вот такой код надо написать для символов в самом начале :
char[] ExcludeSymbolSettings = { '$', '#' };
Теперь встает вопрос : А как сделать так, чтобы файл с настройками всегда был около программы?
Для этого мы напишем функцию, которую я назвал settings(); и служит она для того, чтобы создавать файл с дефолтными настройками до начала работы функции preloader();
if (File.Exists("setTWT.ini") != true)
{
string[] setlines = {"Default settings", "-- TwisT Copy --", "by ZombieVDK", "folder from = ", "$", "folder to = ", "#", "Console status = ", "Autostart copy = ", "Configuration build end... ","For more information about TwisT Copy : www.zombievdk.ru" };
File.WriteAllLines(Application.StartupPath + @"\setTWT.ini", setlines);
MessageBox.Show("Конфигурация создана! Внимание, стандартная конфигурация имеет все поля пустые, для нормальной работы требуется настроить программу след. образом :\r\n1.Указать путь 'Откуда' и 'Куда'\r\n2.Указать доп. Настройки\r\n3.Можно запускать!\r\nTwisT Copy information message.", "Default configuration READY!");
}
  • Запись в конфигурационный файл ведется построчно, поэтому для дефолта мы просто создаем необходимые нам поля:
  • Первые 3 строчки просто информационные в которых написано какая конфигурация, название нашей студии и название ПО;
  • Далее строчка откуда с ключом $, следующими строками строчка куда с ключом #;
  • Строки 'Console status' и 'autostart copy' -это пока ненужные строчки, они будут использованы уже в дальнейшем расширении функционала ПО TwistCopy;
  • File.WriteAllLines создаст файл в случае отсутствия и запишет в него все линии.
Следующим шагом надо прописать FolderBrowserDialog на наши кнопки, которые относят к выбору пути откуда и куда:
private void from_Click(object sender, EventArgs e)
{
FolderBrowserDialog fromchoose = new FolderBrowserDialog();
if (fromchoose.ShowDialog() == DialogResult.OK)
{
pathfrom = fromchoose.SelectedPath;
frombx.Text = pathfrom;
}
}
Мы вызываем FolderBrowserDialog по нажатию на кнопку, затем выбираем папку и записываем её в переменную, и в TextBox. Со второй кнопкой делаем тоже самое, только указываем другую переменную и другой TextBox.

На этом мы заканчиваем первую часть нашей программы. Что мы сделали?
  • Мы реализовали графический интерфейс программы, создание файла настроек, загрузку настроек, запрограммировали кнопки
  • Первичный функционал программы можно считать готовым, остается только добавить FileSystemWatcher и сделать его так, чтобы он работал от нажатия кнопки запустить, после чего он будет, к примеру, производить копирование новых файлов.
В первой части программы мы пользовались только библиотекой System.IO, в след. частях мы уже будем использовать и библиотеку System.Threading
Всем спасибо и удачи!
BLOG COMMENTS POWERED BY DISQUS
70 Последнее изменение Пятница, 10 Март 2017
ZombieVDK Admin

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

Другие материалы в этой категории: « Урок №5 - Асинхронная загрузка из интернета