37

我有一些代码使用 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)。

4

5 回答 5

1

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

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

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

于 2014-05-16T21:01:12.477 回答
1

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

于 2012-12-27T18:19:57.390 回答
0

FileSystemWatcher 是出了名的不可靠。尝试订阅所有事件并查看其他事件是否触发。您可以尝试的一件事是使用计时器定期检查文件是否有更改,例如每两秒一次,而不是使用 FileSystemWatcher。

于 2012-12-12T06:54:56.020 回答
0

我有同样的问题。这门课似乎可以在我的 Windows 8 电脑上运行:

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

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

于 2014-05-19T17:14:06.103 回答
-1

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

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

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

事件不会触发

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

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

于 2015-03-11T06:27:50.190 回答