c# - 为什么 FileSystemWatcher 检测不到来自 Visual Studio 的更改?

标签 c# visual-studio-2008 filesystemwatcher

我制作了一个微型应用程序,可以响应文件夹中文件的更改。但是当我在 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描述了同样的问题,但不幸的是没有解决方案。

最佳答案

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

Deleted

Renamed

因此 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());
        }
    }
}

关于c# - 为什么 FileSystemWatcher 检测不到来自 Visual Studio 的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/680698/

相关文章:

c# - Windows 8 应用程序上的关于页面

c# - Visual Studio 2008 调试问题

vb.net - .NET 调试/发布的不同引用列表

java - Apache JCI FilesystemAlterationMonitor 在启动时处理现有文件夹内容的更改

c# - 如何在不链接的情况下从 .NET 使用命令行 Matlab?

asp.net-core - AspNetCore 2.1 BackgroundService\IHostedService 中的 FileSystemWatcher

c# - 当所述线程正在执行 Console.ReadLine 时,如何中止 .NET 中的另一个线程?

c# - 如何通过 Unity 将 Android 设备预热到 40 度?

c# - .net 后端出现 Azure 移动服务未找到错误

c++ - 在 Visual Studio 2008 中输入俄语字母时出错抛出控制台