为什么在Windows 7上检测到FileSystemWatcher属性更改但不是Windows 8?
我有一些代码使用FileSystemWatcher来监视我的应用程序以外的文件更改。
在Windows 7上,使用.NET 4时,下面的代码会检测文件在应用程序运行时如何被编辑并保存在记事本中。 但是,这种逻辑在Windows 8上不能使用.NET 4.特别是,FileSystemWatcher的Changed事件从不会触发。
public static void Main(string[] args) { const string FilePath = @"C:\users\craig\desktop\notes.txt"; if (File.Exists(FilePath)) { Console.WriteLine("Test file exists."); } var fsw = new FileSystemWatcher(); fsw.NotifyFilter = NotifyFilters.Attributes; fsw.Path = Path.GetDirectoryName(FilePath); fsw.Filter = Path.GetFileName(FilePath); fsw.Changed += OnFileChanged; fsw.EnableRaisingEvents = true; // Block exiting. Console.ReadLine(); } private static void OnFileChanged(object sender, FileSystemEventArgs e) { if (File.Exists(e.FullPath)) { Console.WriteLine("File change reported!"); } }
我明白,我可以改变NotifyFilter还包括NotifyFilters.LastWrite,这可以解决我的问题。 但是,我想了解为什么此代码在Windows 7上工作,但现在无法触发Windows 8上的Changed事件 。 我也很好奇,知道是否有办法在Windows 8中运行时恢复我的Windows 7 FileSystemWatcher行为(无需更改NotifyFilter)。
在编辑之前/之后检查文件上的存档位。 你的代码只是search属性的变化,所以我猜测Windows 7正在更新文件上的Archive位,而Windows 8则不是。
FileSystemWatcher是臭名昭着的不可靠的。 尝试订阅所有的事件,看看其他人是否开火。 你可以尝试的一件事是使用计时器来定期检查文件的变化,比如说每两秒钟一次,而不是使用FileSystemWatcher。
有太多的评论,我只是添加一个答案,以validation您是否知道以下问题:
- 在主UI线程上获取filesystemwatcher事件 (查找Hans Passant的答案)
- WPF – 无法更改OnChanged方法内的GUI属性(从FileSystemWatcher启动)
显然问题是事件是在后台线程上产生的,你需要把这个调用回传给UI线程。
我经历了很多与FileSystemWatcher类的麻烦,并决定不使用它,你可以看到我在这里描述: https : //stackoverflow.com/a/22768610/129130 。 但是,我可能遇到的问题是由于线程同步问题和/或硬件问题。
我有同样的问题。 这个类似乎在我的Windows 8电脑上工作:
https://stackoverflow.com/a/23743268/637142
我使用这个类的原因是因为它在Windows 7和Windows 8上performance相同。
我不知道为什么,但我发现在Windows 8.1下
FileSystemWatcher类的NotifyFilters.LastWrite(Changed事件)将会触发
- 如果我监视我的桌面内的目录(C:\用户\ [用户] \桌面)。
该事件不会发生
- 如果我监视程序文件目录(C:\ Program Files(x86))
可能与权限有关,但是我不知道如何configuration,两个条件都在pipe理员下运行