代码如下
运行起来之后,如果我用记事本编辑 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事件也能监视到,等等。