Ich möchte meine Beobachtungen mit FileSystemWatcher in Mono in Ubuntu 10.10 teilen. Hier ist eine sehr einfache Implementierung von FileSystemWatcher in C#
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.IO;
using System.Reflection;
namespace FileSystemWatcherSandbox
{
public class Program
{
static void Main(string[] args)
{
foreach(DictionaryEntry de in Environment.GetEnvironmentVariables())
{
Console.WriteLine("{0} = {1}",de.Key,de.Value);
}
string basePath = AppDomain.CurrentDomain.BaseDirectory;
Console.WriteLine("watching: {0}", basePath);
FileSystemWatcher fsw = new FileSystemWatcher(basePath);
fsw.Changed += new FileSystemEventHandler(fsw_Changed);
fsw.Created += new FileSystemEventHandler(fsw_Created);
fsw.Deleted += new FileSystemEventHandler(fsw_Deleted);
fsw.Error += new ErrorEventHandler(fsw_Error);
fsw.Renamed += new RenamedEventHandler(fsw_Renamed);
fsw.EnableRaisingEvents = true;
fsw.IncludeSubdirectories = true;
while (true)
{
WaitForChangedResult result = fsw.WaitForChanged(WatcherChangeTypes.All,10000);
Console.WriteLine(result.TimedOut ? "Time out" : "hmmm");
}
}
static void fsw_Renamed(object sender, RenamedEventArgs e)
{
Console.WriteLine("({0}): {1} | {2}", MethodInfo.GetCurrentMethod().Name, e.ChangeType, e.FullPath);
}
static void fsw_Error(object sender, ErrorEventArgs e)
{
Console.WriteLine("({0}): {1}", MethodInfo.GetCurrentMethod().Name, e.GetException().Message);
}
static void fsw_Deleted(object sender, FileSystemEventArgs e)
{
Console.WriteLine("({0}): {1} | {2}", MethodInfo.GetCurrentMethod().Name, e.ChangeType, e.FullPath);
}
static void fsw_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("({0}): {1} | {2}", MethodInfo.GetCurrentMethod().Name, e.ChangeType, e.FullPath);
}
static void fsw_Changed(object sender, FileSystemEventArgs e)
{
Console.WriteLine("({0}): {1} | {2}", MethodInfo.GetCurrentMethod().Name, e.ChangeType, e.FullPath);
}
}
}
Dieser Code wurde getestet und funktioniert sowohl unter Windows XP als auch unter Ubuntu 10.10. Ich möchte jedoch darauf hinweisen, dass sich der FileSystemWatcher unter Ubuntu 10.10 (möglicherweise auch unter früheren Versionen) anders verhält.
Wenn das zu überwachende Verzeichnis keine Unterverzeichnisse enthält, führt der Aufruf eines FileSystemWatcher mit der Eigenschaft IncludeSubdirectories auf true dazu, dass der FileSystemWatcher Ereignisse ignoriert. Wenn jedoch Unterverzeichnisse im Zielverzeichnis vorhanden sind, funktioniert IncludeSubdirectories mit true wie erwartet.
Es wird immer funktionieren, wenn IncludeSubdirectories auf false gesetzt ist. In diesem Fall wird der FileSystemWatcher nur das Zielverzeichnis überwachen.
Ich hoffe, dies ist nützlich für Programmierer, die Mono über verschiedene Betriebssysteme hinweg nutzen und den FileSystemWatcher-Typ aufrufen möchten.