Porting a FileSystemWatcher app from CosoleApplication to Windows Forms

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Andraos
    New Member
    • Jul 2010
    • 2

    #1

    Porting a FileSystemWatcher app from CosoleApplication to Windows Forms

    Hello,

    I have the following app. It works great as a console app. It tracks any file changes, renames, or errors:

    Code:
    static void Main(string[] args)
    	{
    		FileSystemWatcher watcher = new FileSystemWatcher(@"C:\");
    
    		watcher.NotifyFilter = (NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName);
    		watcher.IncludeSubdirectories = true;
    
    		watcher.Changed += new FileSystemEventHandler(OnChanged);
    		watcher.Created += new FileSystemEventHandler(OnChanged);
    		watcher.Deleted += new FileSystemEventHandler(OnChanged);
    		watcher.Renamed += new RenamedEventHandler(OnRenamed);
    		watcher.Error += new ErrorEventHandler(OnError);
    
    		watcher.EnableRaisingEvents = true;
    
    		Console.WriteLine("Press 'Enter' to exit...");
    		Console.ReadLine();
    	}
    
    	private static void OnChanged(object source, FileSystemEventArgs e)
    	{
    		WatcherChangeTypes changeType = e.ChangeType;
    		Console.WriteLine("File {0} {1}", e.FullPath, changeType.ToString());
    	}
    
    	private static void OnRenamed(object source, RenamedEventArgs e)
    	{
    		WatcherChangeTypes changeType = e.ChangeType;
    		Console.WriteLine("File {0} {2} to {1}", e.OldFullPath, e.FullPath, changeType.ToString());
    	}
    
    	private static void OnError(object source, ErrorEventArgs e)
    	{
    		Console.WriteLine("An error has occurred.");
    	}
    I'm trying to port the same app to windows forms.
    But the following code does not display anything in textbox1. any ideas?

    Code:
    string str = "";
    
    		public Form1()
    		{
    			InitializeComponent();
    		}
    
    		private void Form1_Load(object sender, EventArgs e)
    		{
    			FileSystemWatcher watcher = new FileSystemWatcher(@"C:\");
    
    			watcher.NotifyFilter = (NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName);
    			watcher.IncludeSubdirectories = true;
    
    			watcher.Changed += new FileSystemEventHandler(OnChanged);
    			watcher.Created += new FileSystemEventHandler(OnChanged);
    			watcher.Deleted += new FileSystemEventHandler(OnChanged);
    			watcher.Renamed += new RenamedEventHandler(OnRenamed);
    			watcher.Error += new ErrorEventHandler(OnError);
    			watcher.EnableRaisingEvents = true;
    		}
    
    		private void OnChanged(object source, FileSystemEventArgs e)
    		{
    			str.Insert(str.Length, (e.FullPath + " " + e.ChangeType.ToString() + "\n"));
    			textBox1.Invoke(new MethodInvoker(delegate { textBox1.Text = str; }));
    		}
    
    		private void OnRenamed(object source, RenamedEventArgs e)
    		{
    			str.Insert(str.Length, (e.OldFullPath + " " + e.FullPath + " to " + e.ChangeType.ToString() + "\n"));
    			textBox1.Invoke(new MethodInvoker(delegate { textBox1.Text = str; }));
    		}
    
    		private void OnError(object source, ErrorEventArgs e)
    		{
    			str.Insert(str.Length, ("An error has occurred." + "\n"));
    			textBox1.Invoke(new MethodInvoker(delegate { textBox1.Text = str; }));
    		}
    Any ideas at what I'm doing wrong?
    Thanks
  • hype261
    New Member
    • Apr 2010
    • 207

    #2
    Originally posted by Andraos
    Hello,

    I have the following app. It works great as a console app. It tracks any file changes, renames, or errors:

    Code:
    static void Main(string[] args)
    	{
    		FileSystemWatcher watcher = new FileSystemWatcher(@"C:\");
    
    		watcher.NotifyFilter = (NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName);
    		watcher.IncludeSubdirectories = true;
    
    		watcher.Changed += new FileSystemEventHandler(OnChanged);
    		watcher.Created += new FileSystemEventHandler(OnChanged);
    		watcher.Deleted += new FileSystemEventHandler(OnChanged);
    		watcher.Renamed += new RenamedEventHandler(OnRenamed);
    		watcher.Error += new ErrorEventHandler(OnError);
    
    		watcher.EnableRaisingEvents = true;
    
    		Console.WriteLine("Press 'Enter' to exit...");
    		Console.ReadLine();
    	}
    
    	private static void OnChanged(object source, FileSystemEventArgs e)
    	{
    		WatcherChangeTypes changeType = e.ChangeType;
    		Console.WriteLine("File {0} {1}", e.FullPath, changeType.ToString());
    	}
    
    	private static void OnRenamed(object source, RenamedEventArgs e)
    	{
    		WatcherChangeTypes changeType = e.ChangeType;
    		Console.WriteLine("File {0} {2} to {1}", e.OldFullPath, e.FullPath, changeType.ToString());
    	}
    
    	private static void OnError(object source, ErrorEventArgs e)
    	{
    		Console.WriteLine("An error has occurred.");
    	}
    I'm trying to port the same app to windows forms.
    But the following code does not display anything in textbox1. any ideas?

    Code:
    string str = "";
    
    		public Form1()
    		{
    			InitializeComponent();
    		}
    
    		private void Form1_Load(object sender, EventArgs e)
    		{
    			FileSystemWatcher watcher = new FileSystemWatcher(@"C:\");
    
    			watcher.NotifyFilter = (NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName);
    			watcher.IncludeSubdirectories = true;
    
    			watcher.Changed += new FileSystemEventHandler(OnChanged);
    			watcher.Created += new FileSystemEventHandler(OnChanged);
    			watcher.Deleted += new FileSystemEventHandler(OnChanged);
    			watcher.Renamed += new RenamedEventHandler(OnRenamed);
    			watcher.Error += new ErrorEventHandler(OnError);
    			watcher.EnableRaisingEvents = true;
    		}
    
    		private void OnChanged(object source, FileSystemEventArgs e)
    		{
    			str.Insert(str.Length, (e.FullPath + " " + e.ChangeType.ToString() + "\n"));
    			textBox1.Invoke(new MethodInvoker(delegate { textBox1.Text = str; }));
    		}
    
    		private void OnRenamed(object source, RenamedEventArgs e)
    		{
    			str.Insert(str.Length, (e.OldFullPath + " " + e.FullPath + " to " + e.ChangeType.ToString() + "\n"));
    			textBox1.Invoke(new MethodInvoker(delegate { textBox1.Text = str; }));
    		}
    
    		private void OnError(object source, ErrorEventArgs e)
    		{
    			str.Insert(str.Length, ("An error has occurred." + "\n"));
    			textBox1.Invoke(new MethodInvoker(delegate { textBox1.Text = str; }));
    		}
    Any ideas at what I'm doing wrong?
    Thanks
    Is there a reason you are not just doing this?

    Code:
    textBox1.Text = str;

    Comment

    • Andraos
      New Member
      • Jul 2010
      • 2

      #3
      Hi Hype,

      We can't directly assign 'str' to textbox1.Text. The following exception occurs:

      "Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on."

      Hence the <control>.Invok e() method.
      Last edited by Andraos; Jul 27 '10, 09:38 PM. Reason: Typo

      Comment

      Working...