下面是我写的文件观察者类的代码:
class FileWatcher
{
#region Method that begins watching
public static void watch()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = ConfigurationManager.AppSettings["OpticusFileLoc"];
watcher.Filter = ConfigurationManager.AppSettings["OpticusFileName"];
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Changed += new FileSystemEventHandler(OnChanged);
Console.Write("\nWatcher started. Press any key to end.\n");
watcher.EnableRaisingEvents = true;
}
#endregion
#region Trigger function on change
public static void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine("File has been changed.\n");
//watcher.EnableRaisingEvents = false ;
//Program.Main();
}
#endregion
}
如何从OnChanged方法中将watcher.EnableRaisingEvents标志设置为false?
我想我可以通过将FileSystemWatcher对象的声明移到它所在的方法之外来实现,但我想知道是否还有另一种方法可以做到。
答案 0 :(得分:4)
我想我可以通过移动来实现 FileSystemWatcher的声明 它所在方法之外的对象, 但我想知道是否还有另一个 这样做的方法。
这正是你应该这样做的方式(让watcher
成为FileWatcher
类的成员字段)。
那就是说,你也可以这样做:
public static void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine("File has been changed.");
var watcher = source as FileSystemWatcher;
if (watcher != null)
{
watcher.EnableRaisingEvents = false;
}
else
{
// Hmm... some other object called this method.
// Do you really want that to be allowed?
}
}
请注意我在上面的代码中添加的评论。通常,制作诸如public
之类的方法是一个糟糕的调用,因为这使得任何任意代码都可以调用OnChanged
,即使这样做是没有意义的。 (您希望此方法捕获正在更改的文件的事件;如果它实际上可以从任何地方调用,那么您如何知道文件是否实际上已更改,或者这只是来自其他地方的随机调用?)
答案 1 :(得分:2)
source
可能是有问题的FileSystemWatcher
,所以请尝试以下方法:
((FileSystemWatcher)source).EnableChangingEvents = false;
答案 2 :(得分:1)
对象源参数应该是您的FileSystemWatcher对象,因此您可以使用它来关闭它。
public static void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine("File has been changed.\n");
(source as FileSystemWatcher).EnableRaisingEvents = false;
}
答案 3 :(得分:1)
这是你想做的事吗?
public static void OnChanged(object source, FileSystemEventArgs e)
{
FileSystemWatcher watcher = (FileSystemWatcher)source;
watcher.EnableRaisingEvents = false ;
}