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

+0

Модифицированный код кажется работающим сейчас – kanden

ответ

1

Я предполагаю, что вы пытаетесь вызвать OnDelete(e) внутри OnElapsedTimer(), что, конечно, терпит неудачу, потому что e имеет тип ElapsedEventArgs, а не FileSystemEventArgs.

Способ сделать эту работу - создать свой собственный объект FileSystemEventArgs и передать это OnDelete(). В классе нет ничего особенного, он просто хранит информацию, относящуюся к выполняемой операции. В этом случае, вы знаете то, что операция: каталог называется «C: \ Файл» был удален:

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

Обратите внимание, что вы почти наверняка лучше просто слушать в самом OnDelete() обработчика; зачем воспроизводить функциональные возможности, которые уже работают?

+0

Должно быть 'new FileSystemEventArgs (System.IO.WatcherChangeTypes.Deleted,« C: \\ »,« Файл »)' – Candide

+0

@Ingenu Хорошая точка! Не уверен, почему мне нужно будет использовать полное пространство имен для 'WatcherChangeTypes', хотя; 'FileSystemEventArgs' находится в том же пространстве имен, поэтому ни один, ни оба :) – dlev

+0

У вас нет. Ваше сообщение предшествовало моему, это был отрывок из того, что я писал. Я удалил часть одного пространства имен, но не другого. – Candide

0

существует целый ряд проблем, связанных с этим кодом ...

  1. вы не должны быть непосредственно вызовом ondeleted обработчика. если вам нужно выполнить общий код, создайте третий общий метод для вызова.

  2. Console.WriteLine("File: {0} renamed to {1}", e.FullPath); отсутствует второй аргумент {1}

  3. почему вы должны while (Console.Read() != 'q'); дважды?

  4. все это скомпилировано для меня, что я предполагаю, что вы на самом деле имеете ошибку времени выполнения, которая должна быть исправлена ​​путем решения первой точки выше.

+0

Я скорректировал свой код – kanden

+0

, он недостаточно исправлен. почему там есть таймер? и почему вы прямо пытаетесь вызвать ondelete? это не ответственность ваших кодов. наблюдатель там по какой-то причине. вы столкнулись с проблемами, потому что повсюду у вас неправильная кодировка. – Timmerz