2012-03-29 76 views
0

是否有可能實施FileSystemWatcher的委託方法?如何在FileSystemWatcher中實現委託?

我有一個名爲myDelegate的委託方法,我想在定時器函數OnElapsedTimer中調用,我試着調用myDelegate來調用OnDeleted,但第二個參數給出了一個編譯錯誤。我如何在委託方法中傳遞FileSystemEventArgs?

using System; 
using System.IO; 
using System.Security.Permissions; 
using System.Timers; 

public class Watcher 
{ 

    public delegate void myDelegae(object source, FileSystemEventArgs e); 

    public static void Main() 
    {   
    System.Timers.Timer aTimer = new System.Timers.Timer(); 
    aTimer.Elapsed += new ElapsedEventHandler(OnElapsedTimer); 
    aTimer.Interval = 5000; 
    aTimer.Enabled = true; 
    Run(); 
    while (Console.Read() != 'q') ; 
    } 

    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] 
    public static void Run() 
    { 
    string path = @"C:\\File"; 
    FileSystemWatcher watcher = new FileSystemWatcher(path); 
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
     | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Attributes; 

    watcher.NotifyFilter = NotifyFilters.DirectoryName; 

    // Add event handlers. 
    watcher.Deleted += new FileSystemEventHandler(OnDeleted); 

    // Begin watching. 
    watcher.EnableRaisingEvents = true; 

    } 

    private static void OnDeleted(object source, FileSystemEventArgs e) 
    { 
     Console.WriteLine("File: {0}", e.FullPath); 
    } 

    private static void OnElapsedTimer(object source, ElapsedEventArgs e) 
    { 
    Console.WriteLine("Hello World!"); 
    if (!Directory.Exists("C:\\File")) 
    { 
     //Invoke OnDeleted here 
     var fseArgs = new FileSystemEventArgs(WatcherChangeTypes.Deleted, @"C:\", @"File"); 
     OnDeleted("C:\\File",fseArgs); 
    } 
    } 
} 
+0

請張貼編譯錯誤的文字...這將有助於。感謝 – Timmerz 2012-03-29 18:33:19

+0

修改後的代碼,似乎現在的工作我 – kanden 2012-03-29 18:58:44

回答

1

我假設你想打電話OnDelete(e)OnElapsedTimer(),這當然是失敗了,因爲那是eElapsedEventArgs,而不是FileSystemEventArgs

使這項工作的方法是創建自己的FileSystemEventArgs對象,並將其傳遞給OnDelete()。關於課程沒什麼特別之處,它只是存儲與所執行的操作相關的信息。在這種情況下,你知道什麼操作:「:\文件C」已被刪除:名爲目錄

var fseArgs = new FileSystemEventArgs(WatcherChangeTypes.Deleted, @"C:\", @"File"); 
OnDeleted(fseArgs); 

注意,你幾乎肯定會更好只是在OnDelete()處理程序本身在聽;爲什麼重現已經有效的功能?

+0

它應該是'新FileSystemEventArgs(System.IO.WatcherChangeTypes.Deleted, 「C:\\」, 「文件」)' – Candide 2012-03-29 18:45:33

+0

@Ingenu好點!不知道爲什麼我需要爲'WatcherChangeTypes'使用完整的命名空間; 'FileSystemEventArgs'是在同一個命名空間,所以沒有或兩者:) – dlev 2012-03-29 18:48:19

+0

你不知道。你的帖子在我之前,這是我正在寫的東西的一小部分。我刪除了一個命名空間的一部分,但沒有刪除另一個。 – Candide 2012-03-29 18:49:27

0

有一些與此代碼的問題...

  1. 你不應該直接調用ondeleted處理程序。如果您需要執行通用代碼,請創建第三個共享方法進行調用。

  2. Console.WriteLine("File: {0} renamed to {1}", e.FullPath);缺少{1}

  3. ,爲什麼你有while (Console.Read() != 'q');兩次第二個參數?

  4. 這一切編譯對我很好,我假設意味着你實際上有一個運行時錯誤,應通過解決上述的第一點是固定的。

+0

已經糾正我的代碼 – kanden 2012-03-29 18:50:34

+0

這是不夠的修正。爲什麼那裏有計時器?你爲什麼直接試圖調用ondelete?這不是你的代碼責任。觀察員在那裏是有原因的。你遇到了問題,因爲你到處都有不正確的編碼。 – Timmerz 2012-03-29 20:25:20