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
Атрибуты
Реализации

Примеры

В следующем примере создается каталог, указанный 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.

Применяется к

См. также раздел