FileSystemWatcher Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Ожидает уведомления файловой системы об изменениях и инициирует события при изменениях каталога или файла в каталоге.
public ref class FileSystemWatcher : System::ComponentModel::Component, System::ComponentModel::ISupportInitialize
public ref class FileSystemWatcher : IDisposable
public ref class FileSystemWatcher : System::ComponentModel::Component, IDisposable, System::ComponentModel::ISupportInitialize
public class FileSystemWatcher : System.ComponentModel.Component, System.ComponentModel.ISupportInitialize
public class FileSystemWatcher : IDisposable
[System.IO.IODescription("FileSystemWatcherDesc")]
public class FileSystemWatcher : System.ComponentModel.Component, System.ComponentModel.ISupportInitialize
public class FileSystemWatcher : System.ComponentModel.Component, IDisposable, System.ComponentModel.ISupportInitialize
[System.IO.IODescription("")]
public class FileSystemWatcher : System.ComponentModel.Component, System.ComponentModel.ISupportInitialize
type FileSystemWatcher = class
inherit Component
interface ISupportInitialize
type FileSystemWatcher = class
interface IDisposable
[<System.IO.IODescription("FileSystemWatcherDesc")>]
type FileSystemWatcher = class
inherit Component
interface ISupportInitialize
type FileSystemWatcher = class
inherit Component
interface IDisposable
interface ISupportInitialize
[<System.IO.IODescription("")>]
type FileSystemWatcher = class
inherit Component
interface ISupportInitialize
Public Class FileSystemWatcher
Inherits Component
Implements ISupportInitialize
Public Class FileSystemWatcher
Implements IDisposable
Public Class FileSystemWatcher
Inherits Component
Implements IDisposable, ISupportInitialize
- Наследование
- Наследование
-
FileSystemWatcher
- Атрибуты
- Реализации
Примеры
В следующем примере создается каталог, указанный FileSystemWatcher во время выполнения. Компонент задается для отслеживания изменений и LastWrite
LastAccess
времени, создания, удаления или переименования текстовых файлов в каталоге. Если файл изменяется, создается или удаляется, путь к файлу выводится в консоль. При переименовании файла старые и новые пути печатаются в консоли.
#include "pch.h"
using namespace System;
using namespace System::IO;
class MyClassCPP
{
public:
int static Run()
{
FileSystemWatcher^ watcher = gcnew FileSystemWatcher("C:\\path\\to\\folder");
watcher->NotifyFilter = static_cast<NotifyFilters>(NotifyFilters::Attributes
| NotifyFilters::CreationTime
| NotifyFilters::DirectoryName
| NotifyFilters::FileName
| NotifyFilters::LastAccess
| NotifyFilters::LastWrite
| NotifyFilters::Security
| NotifyFilters::Size);
watcher->Changed += gcnew FileSystemEventHandler(MyClassCPP::OnChanged);
watcher->Created += gcnew FileSystemEventHandler(MyClassCPP::OnCreated);
watcher->Deleted += gcnew FileSystemEventHandler(MyClassCPP::OnDeleted);
watcher->Renamed += gcnew RenamedEventHandler(MyClassCPP::OnRenamed);
watcher->Error += gcnew ErrorEventHandler(MyClassCPP::OnError);
watcher->Filter = "*.txt";
watcher->IncludeSubdirectories = true;
watcher->EnableRaisingEvents = true;
Console::WriteLine("Press enter to exit.");
Console::ReadLine();
return 0;
}
private:
static void OnChanged(Object^ sender, FileSystemEventArgs^ e)
{
if (e->ChangeType != WatcherChangeTypes::Changed)
{
return;
}
Console::WriteLine("Changed: {0}", e->FullPath);
}
static void OnCreated(Object^ sender, FileSystemEventArgs^ e)
{
Console::WriteLine("Created: {0}", e->FullPath);
}
static void OnDeleted(Object^ sender, FileSystemEventArgs^ e)
{
Console::WriteLine("Deleted: {0}", e->FullPath);
}
static void OnRenamed(Object^ sender, RenamedEventArgs^ e)
{
Console::WriteLine("Renamed:");
Console::WriteLine(" Old: {0}", e->OldFullPath);
Console::WriteLine(" New: {0}", e->FullPath);
}
static void OnError(Object^ sender, ErrorEventArgs^ e)
{
PrintException(e->GetException());
}
static void PrintException(Exception^ ex)
{
if (ex != nullptr)
{
Console::WriteLine("Message: {0}", ex->Message);
Console::WriteLine("Stacktrace:");
Console::WriteLine(ex->StackTrace);
Console::WriteLine();
PrintException(ex->InnerException);
}
}
};
int main()
{
MyClassCPP::Run();
}
using System;
using System.IO;
namespace MyNamespace
{
class MyClassCS
{
static void Main()
{
using var watcher = new FileSystemWatcher(@"C:\path\to\folder");
watcher.NotifyFilter = NotifyFilters.Attributes
| NotifyFilters.CreationTime
| NotifyFilters.DirectoryName
| NotifyFilters.FileName
| NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.Security
| NotifyFilters.Size;
watcher.Changed += OnChanged;
watcher.Created += OnCreated;
watcher.Deleted += OnDeleted;
watcher.Renamed += OnRenamed;
watcher.Error += OnError;
watcher.Filter = "*.txt";
watcher.IncludeSubdirectories = true;
watcher.EnableRaisingEvents = true;
Console.WriteLine("Press enter to exit.");
Console.ReadLine();
}
private static void OnChanged(object sender, FileSystemEventArgs e)
{
if (e.ChangeType != WatcherChangeTypes.Changed)
{
return;
}
Console.WriteLine($"Changed: {e.FullPath}");
}
private static void OnCreated(object sender, FileSystemEventArgs e)
{
string value = $"Created: {e.FullPath}";
Console.WriteLine(value);
}
private static void OnDeleted(object sender, FileSystemEventArgs e) =>
Console.WriteLine($"Deleted: {e.FullPath}");
private static void OnRenamed(object sender, RenamedEventArgs e)
{
Console.WriteLine($"Renamed:");
Console.WriteLine($" Old: {e.OldFullPath}");
Console.WriteLine($" New: {e.FullPath}");
}
private static void OnError(object sender, ErrorEventArgs e) =>
PrintException(e.GetException());
private static void PrintException(Exception? ex)
{
if (ex != null)
{
Console.WriteLine($"Message: {ex.Message}");
Console.WriteLine("Stacktrace:");
Console.WriteLine(ex.StackTrace);
Console.WriteLine();
PrintException(ex.InnerException);
}
}
}
}
Imports System.IO
Namespace MyNamespace
Class MyClassVB
Shared Sub Main()
Using watcher = New FileSystemWatcher("C:\path\to\folder")
watcher.NotifyFilter = NotifyFilters.Attributes Or
NotifyFilters.CreationTime Or
NotifyFilters.DirectoryName Or
NotifyFilters.FileName Or
NotifyFilters.LastAccess Or
NotifyFilters.LastWrite Or
NotifyFilters.Security Or
NotifyFilters.Size
AddHandler watcher.Changed, AddressOf OnChanged
AddHandler watcher.Created, AddressOf OnCreated
AddHandler watcher.Deleted, AddressOf OnDeleted
AddHandler watcher.Renamed, AddressOf OnRenamed
AddHandler watcher.Error, AddressOf OnError
watcher.Filter = "*.txt"
watcher.IncludeSubdirectories = True
watcher.EnableRaisingEvents = True
Console.WriteLine("Press enter to exit.")
Console.ReadLine()
End Using
End Sub
Private Shared Sub OnChanged(sender As Object, e As FileSystemEventArgs)
If e.ChangeType <> WatcherChangeTypes.Changed Then
Return
End If
Console.WriteLine($"Changed: {e.FullPath}")
End Sub
Private Shared Sub OnCreated(sender As Object, e As FileSystemEventArgs)
Dim value As String = $"Created: {e.FullPath}"
Console.WriteLine(value)
End Sub
Private Shared Sub OnDeleted(sender As Object, e As FileSystemEventArgs)
Console.WriteLine($"Deleted: {e.FullPath}")
End Sub
Private Shared Sub OnRenamed(sender As Object, e As RenamedEventArgs)
Console.WriteLine($"Renamed:")
Console.WriteLine($" Old: {e.OldFullPath}")
Console.WriteLine($" New: {e.FullPath}")
End Sub
Private Shared Sub OnError(sender As Object, e As ErrorEventArgs)
PrintException(e.GetException())
End Sub
Private Shared Sub PrintException(ex As Exception)
If ex IsNot Nothing Then
Console.WriteLine($"Message: {ex.Message}")
Console.WriteLine("Stacktrace:")
Console.WriteLine(ex.StackTrace)
Console.WriteLine()
PrintException(ex.InnerException)
End If
End Sub
End Class
End Namespace
Комментарии
Используется FileSystemWatcher для отслеживания изменений в указанном каталоге. Вы можете отслеживать изменения в файлах и подкаталогах указанного каталога. Вы можете создать компонент для просмотра файлов на локальном компьютере, сетевом диске или удаленном компьютере.
Чтобы отслеживать изменения во всех файлах, задайте Filter для свойства пустую строку ("") или используйте подстановочные знаки ("*.*"). Чтобы просмотреть определенный файл, задайте Filter для свойства имя файла. Например, чтобы отслеживать изменения в файле MyDoc.txt, задайте Filter для свойства значение "MyDoc.txt". Вы также можете отслеживать изменения в определенном типе файла. Например, чтобы отслеживать изменения в текстовых файлах, задайте Filter для свойства значение "*.txt".
Существует несколько типов изменений, которые можно отслеживать в каталоге или файле. Например, вы можете наблюдать за изменениями Attributes
в файлах или Size
каталогах, а LastWrite
также даты и времени. Для этого присвойте свойству NotifyFilter одно из значений NotifyFilters . Дополнительные сведения о типе изменений, которые можно просмотреть, см. в разделе NotifyFilters.
Вы можете отслеживать переименование, удаление или создание файлов или каталогов. Например, чтобы отслеживать переименование текстовых файлов, задайте Filter для свойства значение "*.txt" и вызовите WaitForChanged метод с указанным для его параметра параметром Renamed .
Операционная система Windows уведомляет компонент об изменениях файла в буфере, созданном .FileSystemWatcher Если за короткое время произошло много изменений, буфер может переполняться. Это приводит к тому, что компонент теряет отслеживание изменений в каталоге и предоставляет только одеяло уведомление. Увеличение размера буфера со InternalBufferSize свойством является дорогостоящим, так как оно поступает из нестраничной памяти, которая не может быть переключен на диск, поэтому сохраните буфер как небольшой, но достаточно большой, чтобы не пропустить события изменения файла. Чтобы избежать переполнения буфера, используйте NotifyFilter свойства, IncludeSubdirectories чтобы отфильтровать нежелательные уведомления об изменениях.
Список начальных значений свойств для экземпляра FileSystemWatcherсм. в конструкторе FileSystemWatcher .
При использовании класса обратите внимание на следующее FileSystemWatcher .
Скрытые файлы не игнорируются.
В некоторых системах сообщает об изменениях FileSystemWatcher в файлах с использованием короткого формата имени файла 8.3. Например, изменение параметра LongFileName.LongExtension может быть указано как LongFil~. Lon".
Этот класс содержит требования связывания и наследования на уровне класса, которые применяются ко всем элементам. Если непосредственно вызывающий оператор или производный класс не имеет разрешения полного доверия, возникает исключение SecurityException. Дополнительные сведения о требованиях безопасности см. в разделе Требования связывания.
Максимальный размер свойства для InternalBufferSize мониторинга каталога по сети составляет 64 КБ.
Копирование и перемещение папок
Операционная система и FileSystemWatcher объект интерпретируют действие вырезания и вставки или действие перемещения как действие переименования для папки и ее содержимого. Если вы вырезать и вставить папку с файлами в отслеживаемую папку, FileSystemWatcher объект сообщает только папку как новую, но не ее содержимое, так как они по сути переименованы только.
Чтобы получить уведомление о том, что содержимое папок было перемещено или скопировано в отслеживаемую папку, предоставьте OnChanged и OnRenamed методы обработчика событий, как показано в следующей таблице.
Обработчик событий | Обработанные события | Выполняет |
---|---|---|
OnChanged | Changed, Created, Deleted | Отчет об изменениях атрибутов файлов, созданных файлов и удаленных файлов. |
OnRenamed | Renamed | Выведите список старых и новых путей переименованных файлов и папок, рекурсивно расширяя их при необходимости. |
События и размеры буфера
Обратите внимание, что некоторые факторы могут повлиять на то, какие события изменения файловой системы вызываются, как описано ниже.
Общие операции файловой системы могут вызывать несколько событий. Например, при перемещении файла из одного каталога в другой может возникнуть несколько OnChanged и некоторые OnCreated OnDeleted события. Перемещение файла — это сложная операция, состоящая из нескольких простых операций, поэтому вызывает несколько событий. Аналогичным образом, некоторые приложения (например, антивирусное по) могут вызвать дополнительные события файловой системы, обнаруженные FileSystemWatcher.
Диски FileSystemWatcher могут отслеживаться до тех пор, пока они не переключаются или не удаляются. Не FileSystemWatcher вызывает события для компакт-дисков и DVD-дисков, так как метки времени и свойства не могут изменяться. Удаленные компьютеры должны иметь одну из необходимых платформ, установленных для правильной работы компонента.
Обратите внимание, что FileSystemWatcher событие может пропустить при превышении размера буфера. Чтобы избежать отсутствия событий, следуйте приведенным ниже рекомендациям.
Увеличьте размер буфера InternalBufferSize , задав свойство.
Избегайте просмотра файлов с длинными именами файлов, так как длинное имя файла способствует заполнению буфера. Рассмотрите возможность переименования этих файлов с использованием более коротких имен.
Оставьте код обработки событий максимально коротким.
Конструкторы
FileSystemWatcher() |
Инициализирует новый экземпляр класса FileSystemWatcher. |
FileSystemWatcher(String) |
Инициализирует новый экземпляр класса FileSystemWatcher с заданным каталогом для контроля. |
FileSystemWatcher(String, String) |
Инициализирует новый экземпляр класса FileSystemWatcher с заданным каталогом и типом файлов для контроля. |
Свойства
CanRaiseEvents |
Возвращает значение, показывающее, может ли компонент вызывать событие. (Унаследовано от Component) |
Container |
Возвращает объект IContainer, который содержит коллекцию Component. (Унаследовано от Component) |
DesignMode |
Возвращает значение, указывающее, находится ли данный компонент Component в режиме конструктора в настоящее время. (Унаследовано от Component) |
EnableRaisingEvents |
Получает или задает значение, определяющее, доступен ли данный компонент. |
Events |
Возвращает список обработчиков событий, которые прикреплены к этому объекту Component. (Унаследовано от Component) |
Filter |
Получает или задает строку фильтра, используемую для определения файлов, контролируемых в каталоге. |
Filters |
Возвращает коллекцию всех фильтров, используемых для определения файлов, контролируемых в каталоге. |
IncludeSubdirectories |
Получает или задает значение, показывающее необходимость контроля вложенных каталогов по указанному пути. |
InternalBufferSize |
Получает или задает размер (в байтах) внутреннего буфера. |
NotifyFilter |
Получает или задает тип отслеживаемых изменений. |
Path |
Возвращает или задает путь отслеживаемого каталога. |
Site |
Возвращает или задает тип ISite для объекта FileSystemWatcher. |
SynchronizingObject |
Возвращает или задает объект, используемый для маршалинга вызовов обработчика событий, инициированных в результате изменения каталога. |
Методы
BeginInit() |
Начинает инициализацию класса FileSystemWatcher, используемого в форме или другим компонентом. Инициализация происходит во время выполнения. |
CreateObjRef(Type) |
Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом. (Унаследовано от MarshalByRefObject) |
Dispose() |
Освобождает неуправляемые ресурсы, используемые FileSystemWatcher. |
Dispose() |
Освобождает все ресурсы, занятые модулем Component. (Унаследовано от Component) |
Dispose(Boolean) |
Освобождает неуправляемые ресурсы, используемые объектом FileSystemWatcher, а при необходимости освобождает также управляемые ресурсы. |
EndInit() |
Заканчивает инициализацию объекта FileSystemWatcher, используемого в форме или другим компонентом. Инициализация происходит во время выполнения. |
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
Finalize() |
Освобождает ресурсы, удерживаемые текущим экземпляром. |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetLifetimeService() |
Является устаревшей.
Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра. (Унаследовано от MarshalByRefObject) |
GetService(Type) |
Возвращает объект, представляющий службу, предоставляемую классом Component или классом Container. (Унаследовано от Component) |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
InitializeLifetimeService() |
Является устаревшей.
Получает объект службы времени существования для управления политикой времени существования для этого экземпляра. (Унаследовано от MarshalByRefObject) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
MemberwiseClone(Boolean) |
Создает неполную копию текущего объекта MarshalByRefObject. (Унаследовано от MarshalByRefObject) |
OnChanged(FileSystemEventArgs) |
Вызывает событие Changed. |
OnCreated(FileSystemEventArgs) |
Вызывает событие Created. |
OnDeleted(FileSystemEventArgs) |
Вызывает событие Deleted. |
OnError(ErrorEventArgs) |
Вызывает событие Error. |
OnRenamed(RenamedEventArgs) |
Вызывает событие Renamed. |
ToString() |
Возвращает объект String, содержащий имя Component, если оно есть. Этот метод не следует переопределять. (Унаследовано от Component) |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
WaitForChanged(WatcherChangeTypes) |
Синхронный метод, возвращающий структуру, содержащую сведения о произошедших изменениях, с заданным типом изменений, которые вы хотите контролировать. |
WaitForChanged(WatcherChangeTypes, Int32) |
Синхронный метод, возвращающий структуру, содержащую сведения о произошедших изменениях, с заданным типом изменений, которые вы хотите контролировать, и временем ожидания (в мс) до блокировки по ожиданию. |
WaitForChanged(WatcherChangeTypes, TimeSpan) |
Синхронно возвращает структуру, содержащую конкретные сведения о произошедших изменениях, учитывая тип изменения для отслеживания. |
События
Changed |
Происходит при изменении файла или каталога по заданному пути Path. |
Created |
Происходит при создании файла или каталога по заданному пути Path. |
Deleted |
Происходит при удалении файла или каталога по заданному пути Path. |
Disposed |
Возникает при удалении компонента путем вызова метода Dispose(). (Унаследовано от Component) |
Error |
Происходит, когда экземпляру FileSystemWatcher не удается продолжить отслеживание изменений, или при переполнении внутреннего буфера. |
Renamed |
Происходит при переименовании файла или каталога по заданному пути Path. |