2010-09-17 54 views
1

下面是我的文件觀察者類我寫代碼:如何從另一種方法結束filewatcher?

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

我想我可以通過移動 聲明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,即使這樣做沒有意義。 (您希望這種方法捕獲被更改文件的事件;如果它實際上可以從任何地方調用,那麼您如何知道該文件是否實際上已更改或者這是否是來自其他地方的一些隨機調用?)

+0

雖然你的第二個解決方案的工作,我很想實現它,你爲什麼極力推薦移動的方法外FileSystemWatcher的對象? – xbonez 2010-09-17 16:07:24

+0

但我仍然可以實現你的第二個解決方案,並使OnChanged成爲一個私有方法,不是嗎?任何理由我不應該這樣做? – xbonez 2010-09-17 16:10:54

+0

@xbonez:主要是因爲'FileSystemWatcher'對象本身在邏輯上是FileWatcher類的一個組件,所以將它作爲成員字段可以讓它直接與它進行交互。你通過什麼獲得*而不是分配給一個領域?如果您向班級介紹*任何*其他代碼,您希望與觀察者進行交互,那麼如果不保留對其的引用,就不可能這樣做。 – 2010-09-17 16:12:58

1

對象源參數應該是您的FileSystemWatcher對象,因此您可以使用它來關閉它。

public static void OnChanged(object source, FileSystemEventArgs e) 
    { 
     Console.WriteLine("File has been changed.\n"); 
     (source as FileSystemWatcher).EnableRaisingEvents = false; 
    } 
2

source可能是有問題的FileSystemWatcher,那麼試試這個:

((FileSystemWatcher)source).EnableChangingEvents = false; 
1

這是你想做的事情嗎?

public static void OnChanged(object source, FileSystemEventArgs e) 
{ 
    FileSystemWatcher watcher = (FileSystemWatcher)source; 
    watcher.EnableRaisingEvents = false ; 
} 
相關問題