DontFretBrett
DontFretBrett

Reputation: 1165

FileSystemWatcher Events Not Firing

My FileSystemWatcher isn't throwing any events. I've looked at these similar questions, none seem to be an answer for my problem:

*Edit: My goal is to capture when an XLS file is copied to or created in a directory.

Monitor class:

public class Monitor
{
    FileSystemWatcher watcher = new FileSystemWatcher();
    readonly string bookedPath = @"\\SomeServer\SomeFolder\";

    public delegate void FileDroppedEvent(string FullPath);
    public event FileDroppedEvent FileDropped;

    public delegate void ErrorEvent(Exception ex);
    public event ErrorEvent Error;

    public Monitor()
    {
        watcher.Path = bookedPath;
        watcher.Filter = "*.xls";
        watcher.NotifyFilter = NotifyFilters.LastWrite;
        watcher.Changed += new FileSystemEventHandler(watcher_Changed);
        watcher.Error += new ErrorEventHandler(watcher_Error);
    }

    void watcher_Error(object sender, ErrorEventArgs e)
    {
        Error(e.GetException());
    }

    void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        if (e.ChangeType != WatcherChangeTypes.Created) return;
        FileDropped(e.FullPath);
    }

    public void Start()
    {
        watcher.EnableRaisingEvents = true;
    }

    public void Stop()
    {
        watcher.EnableRaisingEvents = false;
    }
}

Simple form with Listbox:

public partial class Form1 : Form
{
    Monitor monitor = new Monitor();

    public Form1()
    {
        InitializeComponent();
        FormClosing += new FormClosingEventHandler(Form1_FormClosing);
        Load += new EventHandler(Form1_Load);
        monitor.FileDropped += new Monitor.FileDroppedEvent(monitor_FileDropped);
        monitor.Error += new Monitor.ErrorEvent(monitor_Error);
    }

    void Form1_Load(object sender, EventArgs e)
    {
        monitor.Start();
    }

    void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        monitor.Stop();
    }

    void monitor_Error(Exception ex)
    {
        listBox1.Items.Add(ex.Message);
    }

    void monitor_FileDropped(string FullPath)
    {
        listBox1.Items.Add(FullPath);
    }
}

What am I doing wrong?

Upvotes: 4

Views: 12593

Answers (4)

Gauravsa
Gauravsa

Reputation: 6514

Have you tried the following:

watcher.Path = directory name;
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "*.xls";

watcher.Changed += OnDirectoryChange;
watcher.Error += OnError;
watcher.EnableRaisingEvents = true;

// Watch only files not subdirectories.
watcher.IncludeSubdirectories = false;

Upvotes: 0

Daniel L.
Daniel L.

Reputation: 447

This may be because the file metadata hasn't been updated yet. This may happen if you are continuously writing to the file.

Upvotes: 0

Derek W
Derek W

Reputation: 10026

Try this out. Works for me for a very similar task.

watcher.NotifyFilter = NotifyFilters.FileName;   
watcher.Created += new FileSystemEventHandler(handler);     
watcher.Renamed += new RenamedEventHandler(handler);

Upvotes: 2

Haney
Haney

Reputation: 34762

Your issue is with the filters as well as your events I believe. NotifyFilters.LastAccess will only trigger when a file is opened. Try using:

NotifyFilters.LastWrite | NotifyFilters.CreationTime

This will watch for written/created files. Next, hook up to the Created delegate to handle newly created files:

watcher.Created += YourDelegateToHandleCreatedFiles

The way FileSystemWatcher works is to first use the NotifyFilters to limit the event triggers. Then, you use the actual events to do the work. By hooking into the Created event you'll only do work when a file is created.

Upvotes: -1

Related Questions