Salutations, Je voudrais partager mes observations à l'aide FileSystemWatcher Mono dans Ubuntu 10.10. Voici une implémentation très simple de FileSystemWatcher en 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);
}
}
}
Ce code a été testé et fonctionne à la fois sur Windows XP et Ubuntu 10.10. Cependant, je voudrais souligner que sous Ubuntu 10.10 (peut-être aussi des versions antérieures), le FileSystemWatcher se comporte de manière unique.
Si le répertoire en cours de surveillance ne contient pas de sous-répertoires, l'appel d'un FileSystemWatcher avec la propriété IncludeSubdirectories définie sur true entraîne l'ignorance des événements FileSystemWatcher. Toutefois, s'il existe des sous-répertoires dans le répertoire cible, alors IncludeSubdirectories défini sur true fonctionnera comme prévu.
Ce qui fonctionnera toujours est si IncludeSubdirectories a la valeur false. Dans ce cas, FileSystemWatcher ne surveillera que le répertoire cible.
J'espère que cela est utile pour les programmeurs qui souhaitent utiliser Mono sur différents systèmes d'exploitation et appeler le type FileSystemWatcher.
chickenSandwich
J'ai lu ailleurs que le FileSystemWatcher ne fonctionne pas avec les systèmes de fichiers de Linux lors de l'exécution dans un environnement Mono. Merci quand même. – Luke
Le problème avec inotify est qu'il n'est pas portable b/c il n'existe que sous linux et pas sous Unix en général. –
Beagle utilise inotify, donc c'est définitivement emballé dans Mono quelque part. –