views:

80

answers:

4

I have a C# application with a datagrid in windows form. I need to monitor a directory (am using FileSystemWatcher) and refresh the datagrid with list of files in the directory. I am not sure how I can set up the interface to do so? Calling the monitorDirectory() from the windows-form Load() does not seem to work as Load is called only once in the application.

Thanks

+1  A: 

You could update your grid within the OnChanged or OnRenamed event handlers of your FileSystemWatcher.

The example at the link below is handling the events within a Console application. MSDN FileSystemWatcher Class

Greg Andora
A: 

Detecting File Changes with FileSystemWatcher has a good example of how to use the FileSystemWatcher

SwDevMan81
A: 

You can listen to events from the FileSystemWatcher object. The MSDN page posts some recommendations on how to do this.

Essentially, right before calling MonitorDirectory(), you should subscribe to the Changed, Created, Deleted, and Renamed events of your FileSystemWatcher.

Robin
+1  A: 

Full Code

Add a Form1 to your project

Replace Form1.Designer.cs with

namespace Test
{
partial class Form1
{
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.dataGridView1 = new System.Windows.Forms.DataGridView();
        this.fileSystemWatcher1 = new System.IO.FileSystemWatcher();
        ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
        ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).BeginInit();
        this.SuspendLayout();
        // 
        // dataGridView1
        // 
        this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        this.dataGridView1.Location = new System.Drawing.Point(13, 13);
        this.dataGridView1.Name = "dataGridView1";
        this.dataGridView1.Size = new System.Drawing.Size(240, 150);
        this.dataGridView1.TabIndex = 0;
        // 
        // fileSystemWatcher1
        // 
        this.fileSystemWatcher1.EnableRaisingEvents = true;
        this.fileSystemWatcher1.Path = "c:\\Temp";
        this.fileSystemWatcher1.SynchronizingObject = this;
        this.fileSystemWatcher1.Changed += new System.IO.FileSystemEventHandler(this.fileSystemWatcher1_CreatedDeletedChanged);
        this.fileSystemWatcher1.Created += new System.IO.FileSystemEventHandler(this.fileSystemWatcher1_CreatedDeletedChanged);
        this.fileSystemWatcher1.Deleted += new System.IO.FileSystemEventHandler(this.fileSystemWatcher1_CreatedDeletedChanged);
        this.fileSystemWatcher1.Renamed += new System.IO.RenamedEventHandler(this.fileSystemWatcher1_Renamed);
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(370, 301);
        this.Controls.Add(this.dataGridView1);
        this.Name = "Form1";
        this.Text = "Form1";
        this.Load += new System.EventHandler(this.Form1_Load);
        ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
        ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).EndInit();
        this.ResumeLayout(false);

    }

    #endregion

    private System.Windows.Forms.DataGridView dataGridView1;
    private System.IO.FileSystemWatcher fileSystemWatcher1;
}
}

Replace Form1.cs with

using System;
using System.IO;
using System.Windows.Forms;

namespace Test
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    }

    private void PopulateGrid()
    {
        DirectoryInfo dir = new DirectoryInfo(fileSystemWatcher1.Path);

        dataGridView1.DataSource = dir.GetFiles();
    }


    private void fileSystemWatcher1_CreatedDeletedChanged(object sender, FileSystemEventArgs e)
    {
        PopulateGrid();
    }



    private void fileSystemWatcher1_Renamed(object sender, RenamedEventArgs e)
    {
        PopulateGrid();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

        PopulateGrid();
    }
}
}
Mike
who calls the FileSystemWatcher? Thanks
Bi
If I understand the question. Nobody calls it, the control, raises events on its own to let you know something has occurred. So to test the code above add a grid and fileSystemWatcher control to the form, then add a file to the path you ware watching.
Mike