【问题标题】:Why doesn't FileSystemWatcher detect changes from Visual Studio?为什么 FileSystemWatcher 检测不到来自 Visual Studio 的更改?
【发布时间】:2009-03-25 08:37:27
【问题描述】:

我制作了一个小型应用程序,它可以响应文件夹中文件的更改。但是当我在 Visual Studio 2008 中编辑文件时,它从来没有检测到任何东西。如果我改为在记事本中编辑文件,一切都会按预期工作。

当然,Visual Studio 会在某个时候保存文件,但当我关闭工作室时,观察者甚至不会触发。你知道我在这里缺少什么吗?

这个示例代码(C#)应该能说明问题:

FileSystemWatcher fileSystemWatcher = new FileSystemWatcher("C:\Test", "*.cs");
WaitForChangedResult changed = fileSystemWatcher.WaitForChanged(WatcherChangeTypes.All);
Console.Out.WriteLine(changed.Name);

我找到了描述相同问题的blog post by Ayende,但遗憾的是没有解决方案。

【问题讨论】:

  • 我删除了我的回复。我意识到您说您正在记事本中编辑同一个文件,并且观察者看到了它。所以听起来不像是权限问题。
  • 您使用哪个 Windows 版本和服务包?
  • @tanascius:Vista x64 SP1 - 我应该注意一些问题吗?
  • 我添加了一个答案,虽然这不是你的问题
  • @tanascius:如果(何时)我在旧环境中使用我的简单工具,那肯定是需要注意的事情!谢谢分享。

标签: c# visual-studio-2008 filesystemwatcher


【解决方案1】:

这真是令人难以置信...当您尝试下面的示例程序并在 VS 中更改文件时,您会注意到输出窗口中有两行:

已删除

改名

因此,Visual Studio 永远不会更改现有文件,它会将内容保存到具有临时名称的新文件中,然后删除原始文件并将新文件重命名为旧名称。

实际上,这是一个很好的做法,因为如果你按照通常的方式来做(只是写入更改的文件,这会导致Changed 事件被触发),可能会在写入过程之前调用事件处理程序完全的。如果事件处理程序处理文件内容,这可能会导致问题,因为它会处理不完整的文件。

换句话说:这不是一个错误,而是一个特性 ;-)

    static class Program
    {
        [STAThread]
        static void Main()
        {
            FileSystemWatcher FSW = new FileSystemWatcher("c:\\", "*.cs");

            FswHandler Handler = new FswHandler();

            FSW.Changed += Handler.OnEvent;
            FSW.Created += Handler.OnEvent;
            FSW.Deleted += Handler.OnEvent;
            FSW.Renamed += Handler.OnEvent;

            FSW.EnableRaisingEvents = true;

            System.Threading.Thread.Sleep(555000);
            // change the file manually to see which events are fired

            FSW.EnableRaisingEvents = false;
        }
    }
    public class FswHandler
    {
        public void OnEvent(Object source, FileSystemEventArgs Args)
        {
            Console.Out.WriteLine(Args.ChangeType.ToString());
        }
    }
}

【讨论】:

  • 这根本不是我所期望的,但现在它完全有道理。我怀疑通过这种方式在发生崩溃时损坏文件的可能性较小。谢谢!
【解决方案2】:

通过指定 NotifyFilter 属性解决:

FileSystemWatcher w = new FileSystemWatcher();           
w.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
| NotifyFilters.CreationTime;

【讨论】:

  • 这组过滤器实际上让我错过了必要的事件。我正在监听所有四个事件(已更改、已创建、已删除、已重命名),如 @Treb 的回答,但也使用您在此处提供的 NotifyFilter(以及 Filter 属性来过滤到一个特定文件。 ) 我发现我没有收到文件的任何事件(但如果我删除了Filter,我确实收到了一些临时文件的更改事件,查看了整个目录)。如果我删除 NotifyFilter,它似乎会为您提供所有事件,然后我会为我的一个文件获得“已删除”和“重命名”事件。
【解决方案3】:

只是为了记录这种可能性......

来自msdn

如果多个 FileSystemWatcher 对象在 Service Pack 1 之前的 Windows XP 或 Windows 2000 SP2 或更早版本中监视相同的 UNC 路径,则只有一个对象会引发事件。在运行 Windows XP SP1 和更新版本、Windows 2000 SP3 或更新版本或 Windows Server 2003 的计算机上,所有 FileSystemWatcher 对象都会引发相应的事件。

所以我的想法是,无论出于何种原因,Visual Studio 在文件上都拥有自己的 FileSystemWatcher ......但是你没有 UNC 路径,也没有提到操作系统。

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 2017-03-14
    • 2012-11-12
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多