如何从另一种方法结束filewatcher?

时间:2010-09-17 16:01:09

标签: c#

下面是我写的文件观察者类的代码:

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对象的声明移到它所在的方法之外来实现,但我想知道是否还有另一种方法可以做到。

4 个答案:

答案 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 ;
}