Связывание событий в другом классе - PullRequest
1 голос
/ 09 июля 2011

это мой первый пост на C #.

У меня есть вопрос о привязке событий.

У меня есть FileWatcher, который я хотел бы связать с функциями, которые определены вотдельный класс называется FileWatcherEvents.

Я не хочу, чтобы события объявлялись в классе Program, как это можно сделать?

Как видите, я пытаюсь связать события для Createdи Deleted.

Проблема в том, что эти события не вызываются, когда я удаляю или создаю файл в папке.Но когда я объявляю обработчики событий в классе Program, это работает.

Любая помощь или идеи приветствуются.

Программа


using System.IO;

class Program : ServiceBase
{
    private FileSystemWatcher _watcher;

    public Program()
    {
        FileWatcherEvents fwe = new FileWatcherEvents();
        this._watcher = new FileSystemWatcher();
        ((System.ComponentModel.ISupportInitialize)(this._watcher)).BeginInit();
        // 
        // _watcher
        // 
        this._watcher.EnableRaisingEvents = true;
        this._watcher.Filter = "*.txt";
        this._watcher.NotifyFilter =
        ((NotifyFilters)(((((NotifyFilters.FileName 
            | NotifyFilters.DirectoryName)
            | NotifyFilters.LastWrite)
            | NotifyFilters.LastAccess)
            | NotifyFilters.CreationTime)));
        this._watcher.Path = "T:\\out\\";
        this._watcher.Deleted += new FileSystemEventHandler(fwe.ShipmentFileCreated);
        this._watcher.Created += new FileSystemEventHandler(fwe.FileDeleted);
        ((System.ComponentModel.ISupportInitialize)(this._watcher)).EndInit();
    }

    static void Main(string[] args)
    {
        Program prg = new Program();
        Console.Write(FileManager.getNewestFile("T:\\out\\"));
        while (Console.Read() != 'q') ;
    }
}

FileWatcherEvents


class FileWatcherEvents
{
    public void ShipmentFileCreated(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("CREATED: " + sender.ToString() + e.ToString());
    }

    public void FileDeleted(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("DELETED: " + sender.ToString() + e.ToString());
    }
}

Ответы [ 2 ]

1 голос
/ 09 июля 2011

Полагаю, вам нужно будет объявить fwe в более широкой области, например, на уровне Программы, а не внутри конструктора Программы. В противном случае объект исчезнет, ​​и, возможно, все события, которые к нему также приводят (никогда не было совершенно ясно, что происходит с функциями, которые обрабатывают события в экземпляре, когда экземпляр исчезает, но события все еще могут происходить, но это очень возможно, они больше не будут работать).

Edit: Я получил ваш код для работы с некоторыми незначительными изменениями. Главным образом мне пришлось переместить EnableRaisingEvents в конец блока, потому что .NET выдает исключение, если вы делаете это перед установкой пути. Как ты не увидел это исключение?

class Program
{
    private FileSystemWatcher _watcher;

    public Program()
    {
        FileWatcherEvents fwe = new FileWatcherEvents();

        this._watcher = new System.IO.FileSystemWatcher();
        this._watcher.Filter = "*.txt";
        this._watcher.NotifyFilter = ((System.IO.NotifyFilters)(((((
            System.IO.NotifyFilters.FileName | System.IO.NotifyFilters.DirectoryName) 
            | System.IO.NotifyFilters.LastWrite) | System.IO.NotifyFilters.LastAccess) 
            | System.IO.NotifyFilters.CreationTime)));
        this._watcher.Path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
        this._watcher.Deleted += new System.IO.FileSystemEventHandler(fwe.ShipmentFileCreated); 
        this._watcher.Created += new System.IO.FileSystemEventHandler(fwe.FileDeleted);
        this._watcher.EnableRaisingEvents = true;
        Console.ReadLine();
    }

    public static void Main()
    {
        Program prg = new Program();
        using (System.IO.StreamWriter w = new System.IO.StreamWriter(
            System.IO.Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "TestFile.txt"), false))
        {
            w.WriteLine(DateTime.Now.ToLongTimeString());
        }
        Console.ReadLine();
    }
}

class FileWatcherEvents
{
    public void ShipmentFileCreated(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("CREATED: " + sender.ToString() + e.ToString());
    }

    public void FileDeleted(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("DELETED: " + sender.ToString() + e.ToString());
    }
}
0 голосов
/ 09 июля 2011

Оказывается, что код работает нормально, события запускаются, но функции были вызваны не фильтром *.txt в частном объекте FileSystemWatcher.

...