我制作了一个小应用程序来响应文件夹中文件的更改。但是当我在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描述了同样的问题,但遗憾的是没有解决方案。
答案 0 :(得分:26)
这真是令人难以置信......当您尝试下面的示例程序并在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());
}
}
}
答案 1 :(得分:4)
通过指定NotifyFilter属性解决:
FileSystemWatcher w = new FileSystemWatcher();
w.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.CreationTime;
答案 2 :(得分:3)
只是为了记录这种可能性......
来自msdn:
如果多个FileSystemWatcher对象在Service Pack 1或Windows 2000 SP2或更早版本之前的Windows XP中观察相同的UNC路径,则只有一个对象会引发事件。在运行Windows XP SP1及更高版本,Windows 2000 SP3或更高版本或Windows Server 2003的计算机上,所有FileSystemWatcher对象都将引发相应的事件。
所以我的想法是,无论出于何种原因,Visual Studio都会在文件中保存自己的FileSystemWatcher ...但是,您没有UNC路径,也没有提到操作系统。