FileSystemWatcher 类

定义

侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。

public ref class FileSystemWatcher : System::ComponentModel::Component, System::ComponentModel::ISupportInitialize
public ref class FileSystemWatcher : IDisposable
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
type FileSystemWatcher = class
    inherit Component
    interface ISupportInitialize
type FileSystemWatcher = class
    interface IDisposable
[<System.IO.IODescription("FileSystemWatcherDesc")>]
type FileSystemWatcher = class
    inherit Component
    interface ISupportInitialize
Public Class FileSystemWatcher
Inherits Component
Implements ISupportInitialize
Public Class FileSystemWatcher
Implements IDisposable
继承
FileSystemWatcher
继承
FileSystemWatcher
属性
实现

示例

以下示例创建一个 FileSystemWatcher 监视运行时指定的目录。 该组件设置为监视目录中文本文件的创建、删除或重命名的更改和LastWrite时间变化LastAccess。 如果文件已更改、创建或删除,则文件的路径将输出到控制台。 重命名文件时,旧路径和新路径将打印到控制台。

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的变化、LastWrite日期和时间,或文件或目录的Size。 通过将 NotifyFilter 属性设置为 NotifyFilters 之一来完成此操作。 有关可监视的更改类型的详细信息,请参阅 NotifyFilters

可以监视文件或目录的重命名、删除或创建。 例如,若要监视文本文件的重命名,请将 Filter 属性设置为“*.txt”,并调用 WaitForChanged 方法,为其参数指定 Renamed

Windows操作系统会通过FileSystemWatcher创建的缓冲区通知您的组件文件发生的变更。 如果短时间内发生了许多更改,缓冲区可能会溢出。 这会导致组件失去对目录中的更改的跟踪,并且只会提供全面通知。 使用InternalBufferSize属性增加缓冲区的大小非常昂贵,因为它来自无法交换到磁盘的非分页内存,因此请将缓冲区保持在尽可能小的同时足够大,以确保不遗漏任何文件更改事件。 若要避免缓冲区溢出,请使用 NotifyFilterIncludeSubdirectories 属性,以便筛选掉不需要的更改通知。

有关实例 FileSystemWatcher的初始属性值列表,请参阅 FileSystemWatcher 构造函数。

使用 FileSystemWatcher 类时,请考虑以下事实:

  • 隐藏的文件不会被忽略。
  • 在某些系统中, FileSystemWatcher 使用短 8.3 文件名格式报告对文件的更改。 例如,对“LongFileName.LongExtension”的更改可以报告为“LongFil~.Lon”。
  • 您可以为通过网络监控目录的 InternalBufferSize 属性设置的最大大小是 64 KB。

复制和移动文件夹

操作系统和 FileSystemWatcher 对象将剪切-粘贴操作或移动操作解释为对文件夹及其内容的重命名操作。 如果将包含文件的文件夹剪切并粘贴到要监视的文件夹中,该 FileSystemWatcher 对象仅将文件夹报告为新文件夹,但不会报告其内容,因为它们实质上只是重命名。

若要接收到文件夹中的内容已移动或复制到监视文件夹的通知,请根据下表提供 OnChangedOnRenamed 事件处理程序方法。

事件处理程序 已处理的事件 执行
OnChanged ChangedCreatedDeleted 报告文件属性、已创建的文件和已删除文件中的更改。
OnRenamed Renamed 列出重命名的文件和文件夹的旧路径和新路径,根据需要以递归方式展开。

事件和缓冲区大小

请注意,几个因素可能会影响引发哪些文件系统更改事件,如下所述:

  • 常规的文件系统操作可能会引发多个事件。 例如,当文件从一个目录移动到另一个目录时,可能会产生多个OnChanged事件,以及一些OnCreatedOnDeleted事件。 移动文件是一项由多个简单操作组成的复杂操作,因此会引发多个事件。 同样,某些应用程序(例如防病毒软件)可能会导致其他文件系统事件被 FileSystemWatcher检测到。
  • 只要磁盘未切换或删除,FileSystemWatcher 就可以监视磁盘。 FileSystemWatcher 不会针对 CD 和 DVD 引发事件,因为时间戳和属性无法改变。 远程计算机必须安装一个必需的平台,组件才能正常运行。

请注意,当超出缓冲区大小时,FileSystemWatcher 可能会错过事件。 若要避免错过事件,请遵循以下准则:

  • 通过设置 InternalBufferSize 属性来增加缓冲区大小。
  • 避免监视具有长文件名的文件,因为长文件名有助于填充缓冲区。 请考虑使用较短的名称重命名这些文件。
  • 尽量缩短事件处理代码。

构造函数

名称 说明
FileSystemWatcher()

初始化 FileSystemWatcher 类的新实例。

FileSystemWatcher(String, String)

根据要监视的 FileSystemWatcher 指定目录和文件类型,初始化类的新实例。

FileSystemWatcher(String)

根据要监视的 FileSystemWatcher 指定目录,初始化类的新实例。

属性

名称 说明
CanRaiseEvents

获取一个值,该值指示组件是否可以引发事件。

(继承自 Component)
Container

IContainer获取包含 .Component

(继承自 Component)
DesignMode

获取一个值,该值指示当前是否 Component 处于设计模式。

(继承自 Component)
EnableRaisingEvents

获取或设置一个值,该值指示是否启用组件。

Events

获取附加到此 Component对象的事件处理程序的列表。

(继承自 Component)
Filter

获取或设置用于确定目录中监视的文件的筛选器字符串。

Filters

获取用于确定目录中监视的文件的所有筛选器的集合。

IncludeSubdirectories

获取或设置一个值,该值指示是否应监视指定路径中的子目录。

InternalBufferSize

获取或设置内部缓冲区的大小(以字节为单位)。

NotifyFilter

获取或设置要监视的更改的类型。

Path

获取或设置要监视的目录的路径。

Site

获取或设置一ISiteFileSystemWatcher用于 .

SynchronizingObject

获取或设置用于封送由于目录更改而发出的事件处理程序调用的对象。

方法

名称 说明
BeginInit()

开始对窗体或由另一个组件使用的初始化 FileSystemWatcher 。 初始化在运行时发生。

CreateObjRef(Type)

创建一个对象,其中包含生成用于与远程对象通信的代理所需的所有相关信息。

(继承自 MarshalByRefObject)
Dispose()

释放由 <a0/a0> 使用的非托管资源。

Dispose()

释放该 Component命令使用的所有资源。

(继承自 Component)
Dispose(Boolean)

释放由托管资源使用 FileSystemWatcher 的非托管资源,并选择性地释放托管资源。

EndInit()

结束对窗体或由另一个组件使用的初始化 FileSystemWatcher 。 初始化在运行时发生。

Equals(Object)

确定指定的对象是否等于当前对象。

(继承自 Object)
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, Int32)

一种同步方法,该方法返回一个结构,该结构包含有关所发生更改的特定信息,给定要监视的更改类型以及超时前等待的时间(以毫秒为单位)。

WaitForChanged(WatcherChangeTypes, TimeSpan)

根据要监视的更改类型,同步返回包含有关所发生更改的特定信息的结构。

WaitForChanged(WatcherChangeTypes)

一种同步方法,该方法返回一个结构,其中包含有关所发生更改的特定信息,给定要监视的更改类型。

活动

名称 说明
Changed

更改指定 Path 中的文件或目录时发生。

Created

在创建指定 Path 文件或目录时发生。

Deleted

删除指定 Path 中的文件或目录时发生。

Disposed

当组件通过对方法的调用 Dispose() 释放时发生。

(继承自 Component)
Error

当实例 FileSystemWatcher 无法继续监视更改或内部缓冲区溢出时发生。

Renamed

重命名指定 Path 中的文件或目录时发生。

适用于

另请参阅