为什么在Windows 7而不是Windows 8上检测到FileSystemWatcher属性更改?

时间:2012-11-30 00:25:07

标签: c# .net 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)。

5 个答案:

答案 0 :(得分:1)

在编辑之前/之后检查文件上的存档位。您的代码只搜索属性更改,因此我的猜测是Windows 7正在更新文件上的存档位,而Windows 8则没有。

答案 1 :(得分:0)

FileSystemWatcher众所周知是不可靠的。尝试订阅所有活动,看看其他人是否开火。您可以尝试的一件事是使用计时器定期检查文件的更改,例如每两秒检查一次,而不是使用FileSystemWatcher。

答案 2 :(得分:0)

到处都有太多评论,我只想添加一个答案来验证您是否了解以下问题:

显然问题是该事件是在后台线程上引发的,您需要将该调用封送回UI线程。

我在使用FileSystemWatcher类时遇到了很多麻烦,并决定不使用它,因为您可以在此处看到我的描述:https://stackoverflow.com/a/22768610/129130。但是,我遇到的问题可能是由于线程同步问题和/或硬件问题造成的。

答案 3 :(得分:0)

我遇到了同样的问题。这个类似乎适用于我的Windows 8计算机:

https://stackoverflow.com/a/23743268/637142

我使用该类的原因是因为它在Windows 7和Windows 8上的行为相同。

答案 4 :(得分:-1)

我不知道为什么,但我发现在Windows 8.1下

类FileSystemWatcher的NotifyFilters.LastWrite(Changed事件)将触发

  • 如果我监视桌面内的目录(C:\ Users \ [user] \ Desktop)。

事件不会触发

  • 如果我监视程序文件目录(C:\ Program Files(x86))

可能与权限相关但我不知道如何配置它,这两个条件都在管理员下运行