private void Watcher()
        {
           
           FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = @"C:\temp";
            watcher.NotifyFilter =  NotifyFilters.LastWrite;            // Only watch text files.
            watcher.Filter = "*.txt";            // Add event handlers.
            watcher.Changed += new FileSystemEventHandler(fileChange);
            watcher.EnableRaisingEvents = true;        }为什么当文件变化时会执行两次 fileChange方法?

解决方案 »

  1.   

    请 注意 MSDN 的备注
    --------------------------------------
    备注
    当对所监视的目录中的文件或目录的大小、系统属性、上次写入时间、上次访问时间或安全权限进行更改时,将引发 Changed 事件。注意   公共文件系统操作可能会引发多个事件。例如,将文件从一个目录移到另一个目录时,可能会引发若干 OnChanged 以及一些 OnCreated 和 OnDeleted 事件。移动文件是一个包含多个简单操作的复杂操作,因此会引发多个事件。同样,一些应用程序(如反病毒软件)可能导致被 FileSystemWatcher 检测到的附加文件系统事件。
    使用 NotifyFilter 限制处理此事件时引发的通知数。
      

  2.   


    为单一操作生成的多个 Created 事件
    在某些情况下,您可能会注意到单一创建事件会生成多个由您的组件来处理的 Created 事件。例如,如果您使用 FileSystemWatcher 组件来监视目录中新文件的创建,然后使用“记事本”创建一个文件以对其进行测试,您将看到两个已生成的 Created 事件(尽管只创建了一个文件)。这是因为“记事本”在写进程期间执行多个文件系统操作。“记事本”按批写入磁盘,这些批会创建文件的内容和文件属性。其他应用程序可能以同样的方式执行。由于 FileSystemWatcher 监视操作系统活动,则将选取这些应用程序触发的所有事件。注意   “记事本”还可以导致其他有趣的事件生成。例如,如果您使用 ChangeEventFilter 指定只需要监视属性变化,然后使用“记事本”写入到所监视的目录中的一个文件,则将引发一个事件。这是因为“记事本”在此操作期间更新了文件的 Archived 属性。
    在目录中生成的意外事件
    如果更改通过 FileSystemWatcher 组件监视的目录中的文件,则不仅对该文件生成 Changed 事件,还会为目录本身生成类似的事件。这是因为该目录为它所包含的每一文件维护若干类型的信息,其中包括文件的大小和名称、修改日期、属性等等。当上述属性之一更改时,该目录也将发生关联的更改。