当前位置: 代码迷 >> C# >> FileSystemWatcher 为何偏偏对vs2013自身失效?怎么解决
  详细解决方案

FileSystemWatcher 为何偏偏对vs2013自身失效?怎么解决

热度:355   发布时间:2016-05-05 05:19:23.0
FileSystemWatcher 为何偏偏对vs2013自身失效?如何解决?
代码如下
运行起来之后,如果我用记事本编辑 c:\临时\a.txt,能捕获到改变事件;但如果我用vs编辑这个文件,就没有事件。。。



using System;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var fw = new FileSystemWatcher
                     {
                         Path = "c:\\临时",
                         Filter = "a.txt",
                         NotifyFilter = NotifyFilters.LastWrite,
                         EnableRaisingEvents = true
                     };
            fw.Changed += fw_Changed;

            Console.Read();
        }

        static void fw_Changed(object sender, FileSystemEventArgs e) { Console.WriteLine(e.FullPath); }
    }
}

------解决思路----------------------
因为vs对文件的保存很特别(应该是为了数据安全),它保存的时候:
1. 建立临时文件A,把修改的结果保存到A;
2. 建立临时文件B,把原文件内容保存到B,删除原文件;
3. 把A重命名到原文件名;
4. 删除临时文件B。

这个保存过程就没有修改原文件,所以用LastWrite监视原文件没有效果。
想要监视这个修改,根据它的步骤有多种办法。比如你监视 "a.txt*" 就会发现它修改了一个 "a.txt~xxxxxxxxx.TMP" 的文件,或者合并使用NotifyFilters.FileName,用Renamed事件能看到一个临时文件改名成a.txt,或者合并使用NotifyFilters.CreationTime,这样Changed事件也能监视到,等等。
  相关解决方案