如何在FileSystemWatcher中实现委托?

时间:2012-03-29 18:31:00

标签: c#

是否可以为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);
    }
  }
}

2 个答案:

答案 0 :(得分:1)

我假设您正试图在OnDelete(e)内拨打OnElapsedTimer(),这当然会失败,因为e的类型为ElapsedEventArgs,而不是{{} 1}}。

使这项工作的方法是创建自己的FileSystemEventArgs对象,并将其传递给FileSystemEventArgs。该类没有什么特别之处,它只存储与执行的操作相关的信息。在这种情况下,您知道该操作是什么:名为“C:\ File”的目录已被删除:

OnDelete()

请注意,只需要在var fseArgs = new FileSystemEventArgs(WatcherChangeTypes.Deleted, @"C:\", @"File"); OnDeleted(fseArgs); 处理程序本身中进行监听,您几乎肯定会更好。为什么要重现已经有效的功能?

答案 1 :(得分:0)

此代码存在许多问题......

  1. 您不应该直接调用ondeleted处理程序。如果您需要执行公共代码,请创建第三个要调用的共享方法。

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

  3. 为什么你有两次while (Console.Read() != 'q');

  4. 这一切都为我编译好了,我认为这意味着你实际上有一个运行时错误,应该通过解决上面的第一点来解决。