Для отслеживания изменений в заданном каталоге можно воспользоваться классом «FileSystemWatcher» из пространства имен System.IO. Данный класс предназначен для отслеживания изменений в файловой системе. Изменения можно отслеживать как на локальном компьютере, так и на удаленном. ОС Windows уведомляет компонент об изменениях файлов в буфере, созданном объектом «FileSystemWatcher». Если в течение короткого времени происходит много изменений, буфер может переполниться. В результате этот компонент не сможет отслеживать изменения в каталоге и будет давать только общие уведомления. Увеличение размера буфера с использованием свойства «InternalBufferSize» сопряжено с большими накладными расходами, поскольку он формируется не в выгружаемой памяти и не может быть подкачан с диска, поэтому буфер следует делать как можно меньше, в то же время он должен быть достаточно большим, чтобы не пропустить какие-либо события, связанные с изменениями файлов. Чтобы устранить переполнение буфера, необходимо использовать свойства «NotifyFilter» и «IncludeSubdirectories» для фильтрации ненужных уведомлений.
Рассмотрим создание проекта отслеживающего изменения в выбранном пользователем каталоге с настройкой фильтров.
Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте на форму следующие элементы управления:
Сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенный ниже листинг, указания имен методов на определенные события элемента управления «fileSystemWatcher1».
Рассмотрим создание проекта отслеживающего изменения в выбранном пользователем каталоге с настройкой фильтров.
Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте на форму следующие элементы управления:
- System.Windows.Forms.TextBox textBox1 - Элемент управления для вывода пути к выбранной директории;
- System.Windows.Forms.TextBox textBox2 - Элемент управления для указания строки фильтра, используемую для определения файлов, контролируемых в каталоге. По умолчанию используется "*.*" (отслеживаются все файлы);
- System.Windows.Forms.ListBox listBox1 - Элемент управления для вывода событий;
- System.Windows.Forms.GroupBox ControlGroup - Элемент управления объединяющий элементы управления задающие фильтр, наблюдаемые в файле или папке;
- System.Windows.Forms.GroupBox NotificationsGroup – Элемент управления объединяющий элементы управления задающие изменения, наблюдаемые в файле или папке;
- System.Windows.Forms.CheckBox checkBox1 - Элемент управления задающий значение, определяющее, доступен ли данный компонент fileSystemWatcher1;
- System.Windows.Forms.CheckBox checkBox2 - Элемент управления задающий значение, показывающее необходимость контроля изменения атрибутов файла или каталога;
- System.Windows.Forms.CheckBox checkBox3 - Элемент управления задающий значение, показывающее необходимость контроля времени создания файла и каталога;
- System.Windows.Forms.CheckBox checkBox4 - Элемент управления задающий значение, показывающее необходимость контроля изменения имени каталога;
- System.Windows.Forms.CheckBox checkBox5 - Элемент управления задающий значение, показывающее необходимость контроля изменения имени файла;
- System.Windows.Forms.CheckBox checkBox6 - Элемент управления задающий значение, показывающее необходимость контроля даты последнего открытия файла или каталога;
- System.Windows.Forms.CheckBox checkBox7 - Элемент управления задающий значение, показывающее необходимость контроля даты последней записи в файл или папку;
- System.Windows.Forms.CheckBox checkBox8 - Элемент управления задающий значение, показывающее необходимость контроля изменения параметров безопасности файла или папки;
- System.Windows.Forms.CheckBox checkBox9 - Элемент управления задающий значение, показывающее необходимость контроля изменения размер файла или папки;
- System.Windows.Forms.CheckBox checkBox10 – Элемент управления задающий значение, показывающее необходимость контроля вложенных каталогов по указанному пути;
- System.Windows.Forms.Button button1 - Кнопка открытия диалогового окна для выбора каталога, который будет отслеживать элемент управления fileSystemWatcher1;
- System.IO.FileSystemWatcher fileSystemWatcher1 – Элемент управления отслеживающий изменения в файловой системе.
Сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенный ниже листинг, указания имен методов на определенные события элемента управления «fileSystemWatcher1».
//Задаем объект, используемый для маршалинга вызовов обработчика //событий, инициированных в результате изменения каталога. fileSystemWatcher1.SynchronizingObject = this; //Событие возникающее при изменении файла или каталога в заданном пути. fileSystemWatcher1.Changed += new FileSystemEventHandler(LogFileSystemChanges); //Событие возникающее при создании файла или каталога в заданном пути. fileSystemWatcher1.Created += new FileSystemEventHandler(LogFileSystemChanges); //Событие возникающее при удалении файла или каталога в заданном пути. fileSystemWatcher1.Deleted += new FileSystemEventHandler(LogFileSystemChanges); //Событие возникающее при переименовании файла или каталога в заданном пути. fileSystemWatcher1.Renamed += new RenamedEventHandler(LogFileSystemRenaming); //Событие возникающее при переполнении внутреннего буфера. fileSystemWatcher1.Error += new ErrorEventHandler(LogBufferError);Так же добавьте приведенные ниже методы в листинг главной формы.
void LogBufferError(object sender, ErrorEventArgs e)
{
string log = string.Format("{0:G} | Переполнен внутренний буфер", DateTime.Now);
//Добавляем новую запись события.
listBox1.Items.Add(log);
//Выбираем последнюю добавленную запись.
listBox1.SelectedIndex = listBox1.Items.Count - 1;
}
void LogFileSystemRenaming(object sender, RenamedEventArgs e)
{
string log = string.Format("{0:G} | {1} | Переименован файл {2}",
DateTime.Now, e.FullPath, e.OldName);
//Добавляем новую запись события.
listBox1.Items.Add(log);
//Выбираем последнюю добавленную запись.
listBox1.SelectedIndex = listBox1.Items.Count - 1;
}
void LogFileSystemChanges(object sender, FileSystemEventArgs e)
{
string log = string.Format("{0:G} | {1} | {2}", DateTime.Now, e.FullPath, e.ChangeType);
//Добавляем новую запись события.
listBox1.Items.Add(log);
//Выбираем последнюю добавленную запись.
listBox1.SelectedIndex = listBox1.Items.Count - 1;
} Перейдите в конструктор главной формы и выполните двойной клик левой клавишей мыши по элементу управления «button1», вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «button1_Click», события «Click», выполняющегося при клике по данному элементу управления. Вставьте в тело данного метода приведенный ниже листинг вывода окна выбора директории для отслеживания.//Создание класса для вывода окна выбора директории
FolderBrowserDialog fbd = new FolderBrowserDialog();
//Выводим диалоговое окно для выбора каталога.
// Данный класс возвращает следующие значения:
// 1) Объект System.Windows.Forms.DialogResult.OK,
// если пользователь нажимает кнопку
// ОК в диалоговом окне;
// 2) Объект System.Windows.Forms.DialogResult.Cancel,
// если пользователь закрывает диалоговое окно.
DialogResult result = fbd.ShowDialog();
//Если пользователь выбрал директорию
//и нажал ОК, то выводим путь в textBox1
if (result == DialogResult.OK)
{
//Вывод пути к
//выбранной директории
textBox1.Text = fbd.SelectedPath;
} Вернитесь в конструктор главной формы и выполните двойной клик левой клавишей мыши по элементу управления «MonitoringInput»(CheckBox), вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «MonitoringInput_CheckedChanged», события «CheckedChanged», возникающего при каждом изменении свойства «Check». Вставьте в тело данного метода приведенный ниже листинг формирования фильтра для элемента управления «fileSystemWatcher1».//Получаем путь к выбранному каталогу.
string monitoredFolder = textBox1.Text;
//Определяем, указывает ли заданный путь
//на существующий каталог на диске.
bool folderExists = Directory.Exists(monitoredFolder);
//Проверка существования директории.
if (folderExists)
{
//Задаем путь отслеживаемого каталога.
fileSystemWatcher1.Path = monitoredFolder;
//Задаем строку фильтра, используемую для определения файлов,
//контролируемых в каталоге.
//По умолчанию используется "*.*" (отслеживаются все файлы).
fileSystemWatcher1.Filter = textBox2.Text;
//Задаем значение, показывающее необходимость контроля вложенных
//каталогов по указанному пути.
fileSystemWatcher1.IncludeSubdirectories = checkBox10.Checked;
//Отслеживаемые изменения.
NotifyFilters notificationFilters = new NotifyFilters();
//Атрибуты файла и папки.
if (checkBox2.Checked) notificationFilters = notificationFilters
| NotifyFilters.Attributes;
//Время создания файла и папки.
if (checkBox3.Checked) notificationFilters = notificationFilters
| NotifyFilters.CreationTime;
//Имя каталога.
if (checkBox4.Checked) notificationFilters = notificationFilters
| NotifyFilters.DirectoryName;
//Имя файла
if (checkBox5.Checked) notificationFilters = notificationFilters
| NotifyFilters.FileName;
//Дата последнего открытия файла или папки.
if (checkBox6.Checked) notificationFilters = notificationFilters
| NotifyFilters.LastAccess;
//Дата последней записи в файл или папку.
if (checkBox7.Checked) notificationFilters = notificationFilters
| NotifyFilters.LastWrite;
//Параметры безопасности файла или папки.
if (checkBox8.Checked) notificationFilters = notificationFilters
| NotifyFilters.Security;
//Размер файла или папки.
if (checkBox9.Checked) notificationFilters = notificationFilters
| NotifyFilters.Size;
//Задаем тип отслеживаемых изменений.
fileSystemWatcher1.NotifyFilter = notificationFilters;
//Задаем значение, определяющее, доступен ли данный компонент.
fileSystemWatcher1.EnableRaisingEvents = checkBox1.Checked;
}
else if (checkBox1.Checked)
{
MessageBox.Show(this, "Выбранная директория не существует!",
"Мониторинг", MessageBoxButtons.OK, MessageBoxIcon.Error);
//Выключаем мониторинг при ошибке.
checkBox1.Checked = false;
}
//После запуске мониторинга, блокируем элементы управления.
textBox1.Enabled = textBox2.Enabled =
NotificationsGroup.Enabled = !checkBox1.Checked; Запустите ваш проект, нажав на клавиатуре клавишу «F5». У вас откроется главная форма проекта, нажмите кнопку «Открыть», для выбора каталога, в котором будут отслеживаться изменения. Для запуска отслеживания, установите галочку в элементе управления «checkBox1» (Задающем значение, определяющее, доступен ли элемент управления fileSystemWatcher1). После запуска у вас будут выводиться все события, которые вы настроили в фильтре.Ссылка для скачивания примера: Яндекс.Диск





При выполнении данного проекта срабатывает исключение. Как поступать в таком случае.
ОтветитьУдалитьЗдравствуйте Лора, вышлите пожалуйста ваш проект через форму обратной связи, для проверки нашими специалистами.
ОтветитьУдалитьСпасибо. Проблема была в том, что документ был доступен только для чтения.
ОтветитьУдалитьОшибка.При выключенном интернете пишет что я все равно в сети )
ОтветитьУдалитьЗдравствуйте, а вы сетевой кабель вытаскивали или просто отключили интернет?
ОтветитьУдалитьДобрый вечер! Такая проблема, что делать?
ОтветитьУдалитьЗдравствуйте, замените данную строку на:
ОтветитьУдалитьprivate List<TreeNode> CurrentNodeMatches = new List<TreeNode>();
Здравствуйте дорогие друзья! Опыт в программировании совсем нулевой. Но очень интересно как это подключить к сайту ?
ОтветитьУдалитьА можно более детально, как решить проблему?
ОтветитьУдалитьУ меня аналогичная ошибка.