2012-03-29 66 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