开发者

Binding Events In another class

开发者 https://www.devze.com 2023-03-18 04:01 出处:网络
this is my first C# post. I have a question on event binding. I have a FileWatcher which I\'d like to bind to functions that are defined in a separate class called FileWatcherEvents.

this is my first C# post.

I have a question on event binding.

I have a FileWatcher which I'd like to bind to functions that are defined in a separate class called FileWatcherEvents.

I don't want the events to be declared in the Program class, how can this be done?

As you can see, I try to bind the events for Created and Deleted.

The problem is that these events are not called when I delete or create a file in the folder. But when I declare the event handlers in the Program class, it does work.

Any help or insights is appreciated.

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)
    {
 开发者_如何学Go       Console.WriteLine("DELETED: " + sender.ToString() + e.ToString());
    }
}


I believe you would need to declare fwe in a larger scope, like at the Program level instead of inside the Program constructor. Otherwise the object will go away, and possibly all the events that lead to it as well (never been entirely clear on what happens to the functions that handle events on an instance when the instance goes away, but the events could still occur, but it's very possible they will no longer run).

Edit: I got your code to work with some minor adjustments. Mainly I had to move EnableRaisingEvents to the end of the block because .NET throws an exception if you do it before setting the path. How did you not see that exception?

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());
    }
}


Turns out that the code works fine, the events fired, but the functions weren't because of the *.txt filter in the private FileSystemWatcher object.

0

精彩评论

暂无评论...
验证码 换一张
取 消