是否可以为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 :(得分:1)
我假设您正试图在OnDelete(e)
内拨打OnElapsedTimer()
,这当然会失败,因为e
的类型为ElapsedEventArgs
,而不是{{} 1}}。
使这项工作的方法是创建自己的FileSystemEventArgs
对象,并将其传递给FileSystemEventArgs
。该类没有什么特别之处,它只存储与执行的操作相关的信息。在这种情况下,您知道该操作是什么:名为“C:\ File”的目录已被删除:
OnDelete()
请注意,只需要在var fseArgs = new FileSystemEventArgs(WatcherChangeTypes.Deleted, @"C:\", @"File");
OnDeleted(fseArgs);
处理程序本身中进行监听,您几乎肯定会更好。为什么要重现已经有效的功能?
答案 1 :(得分:0)
此代码存在许多问题......
您不应该直接调用ondeleted处理程序。如果您需要执行公共代码,请创建第三个要调用的共享方法。
Console.WriteLine("File: {0} renamed to {1}", e.FullPath);
缺少第二个参数{1}
为什么你有两次while (Console.Read() != 'q');
?
这一切都为我编译好了,我认为这意味着你实际上有一个运行时错误,应该通过解决上面的第一点来解决。