FileSystemWatcher 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。
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 监视运行时指定的目录。 该组件设置为监视目录中文本文件的创建、删除或重命名的更改和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属性增加缓冲区的大小非常昂贵,因为它来自无法交换到磁盘的非分页内存,因此请将缓冲区保持在尽可能小的同时足够大,以确保不遗漏任何文件更改事件。 若要避免缓冲区溢出,请使用 NotifyFilter 和 IncludeSubdirectories 属性,以便筛选掉不需要的更改通知。
有关实例 FileSystemWatcher的初始属性值列表,请参阅 FileSystemWatcher 构造函数。
使用 FileSystemWatcher 类时,请考虑以下事实:
- 隐藏的文件不会被忽略。
- 在某些系统中, FileSystemWatcher 使用短 8.3 文件名格式报告对文件的更改。 例如,对“LongFileName.LongExtension”的更改可以报告为“LongFil~.Lon”。
- 您可以为通过网络监控目录的 InternalBufferSize 属性设置的最大大小是 64 KB。
复制和移动文件夹
操作系统和 FileSystemWatcher 对象将剪切-粘贴操作或移动操作解释为对文件夹及其内容的重命名操作。 如果将包含文件的文件夹剪切并粘贴到要监视的文件夹中,该 FileSystemWatcher 对象仅将文件夹报告为新文件夹,但不会报告其内容,因为它们实质上只是重命名。
若要接收到文件夹中的内容已移动或复制到监视文件夹的通知,请根据下表提供 OnChanged 和 OnRenamed 事件处理程序方法。
| 事件处理程序 | 已处理的事件 | 执行 |
|---|---|---|
| OnChanged | Changed、Created、Deleted | 报告文件属性、已创建的文件和已删除文件中的更改。 |
| OnRenamed | Renamed | 列出重命名的文件和文件夹的旧路径和新路径,根据需要以递归方式展开。 |
事件和缓冲区大小
请注意,几个因素可能会影响引发哪些文件系统更改事件,如下所述:
- 常规的文件系统操作可能会引发多个事件。 例如,当文件从一个目录移动到另一个目录时,可能会产生多个OnChanged事件,以及一些OnCreated和OnDeleted事件。 移动文件是一项由多个简单操作组成的复杂操作,因此会引发多个事件。 同样,某些应用程序(例如防病毒软件)可能会导致其他文件系统事件被 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 |
获取或设置一ISite个FileSystemWatcher用于 . |
| SynchronizingObject |
获取或设置用于封送由于目录更改而发出的事件处理程序调用的对象。 |
方法
活动
| 名称 | 说明 |
|---|---|
| Changed |
更改指定 Path 中的文件或目录时发生。 |
| Created |
在创建指定 Path 文件或目录时发生。 |
| Deleted |
删除指定 Path 中的文件或目录时发生。 |
| Disposed |
当组件通过对方法的调用 Dispose() 释放时发生。 (继承自 Component) |
| Error |
当实例 FileSystemWatcher 无法继续监视更改或内部缓冲区溢出时发生。 |
| Renamed |
重命名指定 Path 中的文件或目录时发生。 |