君子性非异也,善假于物也。

如有恒,何须三更起,半夜眠;最怕莫,三天打鱼两天晒网,竹篮打水一场空!
posts - 31, comments - 23, trackbacks - 0, articles - 30
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

文件系统监控

Posted on 2006-10-15 13:37 neter 阅读(1575) 评论(0)  编辑 收藏 引用 所属分类: 程序设计
NET Framework 类库 
FileSystemWatcher 类 

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

命名空间:System.IO
程序集:System(在 system.dll 中)

继承层次结构

System.Object
   System.MarshalByRefObject
     System.ComponentModel.Component
      System.IO.FileSystemWatcher

C# 用法:

1
public class FileSystemWatcher : Component, ISupportInitialize

使用 FileSystemWatcher 监视指定目录中的更改。可监视指定目录中的文件或子目录的更改。可以创建一个组件来监视本地计算机、网络驱动器或远程计算机上的文件。

若要通过文件扩展名监视所有文件中的更改,请将 Filter 属性设置为空字符串 ("") 或使用通配符(“*.*”)。若要监视特定的文件,请将 Filter 属性设置为该文件名。例如,若要监视文件 MyDoc.txt 中的更改,请将 Filter 属性设置为“MyDoc.txt”。也可以监视特定类型文件中的更改。例如,若要监视文本文件中的更改,请将 Filter 属性设置为“*.txt”。

可监视目录或文件中的若干种更改。例如,可监视文件或目录的 AttributesLastWrite 日期和时间或 Size 方面的更改。通过将 NotifyFilter 属性设置为 NotifyFilters 值之一来达到此目的。有关可监视的更改类型的更多信息,请参见 NotifyFilters

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

Windows 操作系统在 FileSystemWatcher 创建的缓冲区中通知组件文件发生更改。如果短时间内有很多更改,则缓冲区可能会溢出。这将导致组件失去对目录更改的跟踪,并且它将只提供一般性通知。使用 InternalBufferSize 属性来增加缓冲区大小的开销较大,因为它来自无法换出到磁盘的非页面内存,所以应确保缓冲区大小适中(尽量小,但也要有足够大小以便不会丢失任何文件更改事件)。若要避免缓冲区溢出,请使用 NotifyFilterIncludeSubdirectories 属性,以便可以筛选掉不想要的更改通知。

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

使用 FileSystemWatcher 类时,请注意以下事项。

  • 不忽略隐藏文件。

  • 在某些系统中,FileSystemWatcher 使用 8.3 短文件名格式报告文件更改。例如,对“LongFileName.LongExtension”的更改可能报告为“LongFi~.Lon”。

  • 此类在应用于所有成员的类级别上包含一个链接要求和一个继承要求。如果直接调用方或派生类不具有完全信任权限,则会引发 SecurityException。有关安全要求的详细信息,请参见 链接要求

复制和移动文件夹

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

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

 

事件处理程序

已处理的事件

执行

OnChanged

Changed, Created, Deleted

报告文件属性的更改、创建的文件和删除的文件。

OnRenamed

Renamed

列出重命名的文件和文件夹的新旧路径,需要时可以递归扩展。

事件和缓冲区大小

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

  • 公共文件系统操作可能会引发多个事件。例如,将文件从一个目录移到另一个目录时,可能会引发若干 OnChanged 以及一些 OnCreatedOnDeleted 事件。移动文件是一个包含多个简单操作的复杂操作,因此会引发多个事件。同样,有些应用程序(例如,防病毒软件)可能会导致可由 FileSystemWatcher 检测到的其他文件系统事件。

  • 只要磁盘没有切换或移除,FileSystemWatcher 就可监视它们。因为 CD 和 DVD 的时间戳和属性不能更改,所以 FileSystemWatcher 不为 CD 和 DVD 引发事件。要使该组件正常运行,远程计算机必须具有所需的这些平台之一。但是,无法从 Windows NT 4.0 计算机监视远程 Windows NT 4.0 计算机。

  • 在 Windows XP(Service Pack 1 之前版本)或者 Windows 2000 SP2 或更低版本中,如果多个 FileSystemWatcher 对象正在监视同一个 UNC 路径,则只有其中一个对象会引发事件。在运行 Windows XP SP1 及之后版本、Windows 2000 SP3 或之后版本或者 Windows Server 2003 的计算机上,所有 FileSystemWatcher 对象都将引发相应的事件。

  • 设置 Filter 不会减少进入缓冲区中的内容。

请注意,由于 Windows 操作系统的依赖项,当丢失某个事件或超出缓冲区大小时,FileSystemWatcher 不会引发 Error 事件。若要防止丢失事件,请遵从这些准则:

  • 使用 InternalBufferSize 属性增加缓冲区大小可以防止丢失文件系统更改事件。

  • 避免监视带有长文件名的文件。考虑使用较短的名称进行重命名。

  • 尽可能使事件处理代码短小。

FileSystemWatcher 成员

公共构造函数公共构造函数

 名称 说明
Public methodFileSystemWatcher已重载。初始化 FileSystemWatcher 类的新实例。
公共属性公共属性
 名称 说明
Public propertyContainer  获取 IContainer,它包含 Component。(从 Component 继承。)
Public propertyEnableRaisingEvents获取或设置一个值,该值指示是否启用此组件。
Public propertyFilter获取或设置筛选字符串,用于确定在目录中监视哪些文件。
Public propertyIncludeSubdirectories获取或设置一个值,该值指示是否监视指定路径中的子目录。
Public propertyInternalBufferSize获取或设置内部缓冲区的大小。
Public propertyNotifyFilter获取或设置要监视的更改类型。
Public propertyPath获取或设置要监视的目录的路径。
Public propertySite已重写。获取或设置 FileSystemWatcherISite
Public propertySynchronizingObject获取或设置一个对象,该对象用于封送因目录更改而发出的事件处理程序调用。
受保护的属性受保护的属性
 名称 说明
Protected propertyCanRaiseEvents  获取一个指示组件是否可以引发事件的值。(从 Component 继承。)
Protected propertyDesignMode  获取一个值,用以指示 Component 当前是否处于设计模式。(从 Component 继承。)
Protected propertyEvents  获取附加到此 Component 的事件处理程序的列表。(从 Component 继承。)
公共方法公共方法
 名称 说明
Public methodBeginInit开始初始化在窗体上使用或由另一个组件使用的 FileSystemWatcher。初始化发生在运行时。
Public methodCreateObjRef  创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (从 MarshalByRefObject 继承。)
Public methodDispose已重载。 释放由 FileSystemWatcher 占用的资源。
Public methodEndInit结束在窗体上使用或由另一个组件使用的 FileSystemWatcher 的初始化。初始化发生在运行时。
Public methodEquals  已重载。 确定两个 Object 实例是否相等。 (从 Object 继承。)
Public methodGetHashCode  用作特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。 (从 Object 继承。)
Public methodGetLifetimeService  检索控制此实例的生存期策略的当前生存期服务对象。 (从 MarshalByRefObject 继承。)
Public methodGetType  获取当前实例的 Type。 (从 Object 继承。)
Public methodInitializeLifetimeService  获取控制此实例的生存期策略的生存期服务对象。 (从 MarshalByRefObject 继承。)
Public methodStaticReferenceEquals  确定指定的 Object 实例是否是相同的实例。 (从 Object 继承。)
Public methodToString  返回包含 Component 的名称的 String(如果有)。不应重写此方法。 (从 Component 继承。)
Public methodWaitForChanged已重载。 返回结构的同步方法,该结构包含有关已发生的更改的特定信息。
受保护的方法受保护的方法
 名称 说明
Protected methodDispose已重载。 已重写。 释放由 FileSystemWatcher 占用的资源。
Protected methodFinalize  在通过垃圾回收将 Component 回收之前,释放非托管资源并执行其他清理操作。 (从 Component 继承。)
Protected methodGetService  返回一个对象,该对象表示由 Component 或它的 Container 提供的服务。 (从 Component 继承。)
Protected methodMemberwiseClone  已重载。 (从 MarshalByRefObject 继承。)
Protected methodOnChanged引发 Changed 事件。
Protected methodOnCreated引发 Created 事件。
Protected methodOnDeleted引发 Deleted 事件。
Protected methodOnError引发 Error 事件。
Protected methodOnRenamed引发 Renamed 事件。
公共事件公共事件
 名称 说明
Public eventChanged当更改指定 Path 中的文件和目录时发生。
Public eventCreated当在指定 Path 中创建文件和目录时发生。
Public eventDeleted删除指定 Path 中的文件或目录时发生。
Public eventDisposed  添加事件处理程序以侦听组件上的 Disposed 事件。(从 Component 继承。)
Public eventError当内部缓冲区溢出时发生。
Public eventRenamed重命名指定 Path 中的文件或目录时发生。


下面的示例创建一个 FileSystemWatcher,以便在运行时监视指定的目录。组件设置为监视 LastWriteLastAccess 时间方面的更改,以及目录中文本文件的创建、删除或重命名。如果更改、创建或删除文件,文件路径将被输出到控制台。在文件重命名后,旧路径和新路径都输出到控制台。

在此示例中使用 System.DiagnosticsSystem.IO 命名空间。

C# 事例:

 1
public class Watcher
 2{
 3
 4    public static void Main()
 5    {
 6    Run();
 7
 8    }

 9
10    [PermissionSet(SecurityAction.Demand, Name="FullTrust")]
11    public static void Run()
12    {
13        string[] args = System.Environment.GetCommandLineArgs();
14 
15        // If a directory is not specified, exit program.
16        if(args.Length != 2)
17        {
18            // Display the proper way to call the program.
19            Console.WriteLine("Usage: Watcher.exe (directory)");
20            return;
21        }

22
23        // Create a new FileSystemWatcher and set its properties.
24        FileSystemWatcher watcher = new FileSystemWatcher();
25        watcher.Path = args[1];
26        /* Watch for changes in LastAccess and LastWrite times, and 
27           the renaming of files or directories. */

28        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
29           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
30        // Only watch text files.
31        watcher.Filter = "*.txt";
32
33        // Add event handlers.
34        watcher.Changed += new FileSystemEventHandler(OnChanged);
35        watcher.Created += new FileSystemEventHandler(OnChanged);
36        watcher.Deleted += new FileSystemEventHandler(OnChanged);
37        watcher.Renamed += new RenamedEventHandler(OnRenamed);
38
39        // Begin watching.
40        watcher.EnableRaisingEvents = true;
41
42        // Wait for the user to quit the program.
43        Console.WriteLine("Press \'q\' to quit the sample.");
44        while(Console.Read()!='q');
45    }

46
47    // Define the event handlers.
48    private static void OnChanged(object source, FileSystemEventArgs e)
49    {
50        // Specify what is done when a file is changed, created, or deleted.
51       Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
52    }

53
54    private static void OnRenamed(object source, RenamedEventArgs e)
55    {
56        // Specify what is done when a file is renamed.
57        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
58    }

59}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理