【问题标题】:Why are FileSystemWatcher Attribute changes detected on Windows 7 but not Windows 8?为什么在 Windows 7 而不是 Windows 8 上检测到 FileSystemWatcher 属性更改?
【发布时间】:2012-11-18 04:48:48
【问题描述】:

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

【问题讨论】:

  • 您是否一直关注本网站上发布的 Microsoft 在线支持建议?我假设您就是同一个 Craig..social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/…
  • 纯文档位于此处:msdn.microsoft.com/en-us/library/… 它表明它应该在 Windows 8 中工作。有问题的文件甚至有属性吗?这似乎是一个错误。暂时你将不得不使用一种解决方法,直到它被修复。
  • 根据“THERE DOCUMENTATION”有很多东西应该可以工作,但即使在 .NET 4.0 中也存在一些错误,这些错误破坏了 3.5 和 2.0 中的工作内容
  • @DJKRAZE - 我发布了该评论,因为您发布了您的评论并链接到表明已提交实际错误报告的线程。自 2012 年 11 月 25 日以来,他们一直在查看错误报告,这需要一段时间。
  • @DJKRAZE 是的,我是同一个克雷格。我在这里发帖是因为 MSDN 论坛管理员只是将我的问题添加到 Connect。虽然这很好,但 Ramhound 是正确的,我在很长一段时间内都不会收到 MS 的回复。此外,我希望 StackOverflow 上的某个人可以回答我的实际问题,这就是 为什么 Windows 8 上存在不同的行为,而不一定是如何修复它。

标签: c# .net windows-8


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    到处都是cmet太多,我只是添加一个答案来验证您是否意识到以下问题:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 虽然我已经阅读过其他人在使用 FileSystemWatcher 时遇到的问题,但在 Windows 8 之前,它一直都可以正常工作。另外,正如我在问题中指出的那样,我们已经通过更改 NotifyFilter 找到了解决方法包括 LastWrite。问题仍然是在 Windows 8 上发生了哪些变化导致此代码不再起作用。
      【解决方案4】:

      我遇到了同样的问题。这个类似乎可以在我的 windows 8 电脑上运行:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        事件不会触发

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-22
          • 1970-01-01
          • 2011-03-16
          • 1970-01-01
          • 2014-07-14
          • 2018-05-15
          • 1970-01-01
          • 2014-03-21
          相关资源
          最近更新 更多