saludos, me gustaría compartir mis observaciones usando FileSystemWatcher en Mono en Ubuntu 10.10. Aquí hay una muy simple aplicación 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);
}
}
}
Este código fue probado y funciona tanto en Windows XP como en Ubuntu 10.10. Sin embargo, me gustaría señalar que bajo Ubuntu 10.10 (posiblemente versiones anteriores también), FileSystemWatcher se comporta de forma única.
Si el directorio que se está viendo no contiene subdirectorios, al invocar un FileSystemWatcher con la propiedad IncludeSubdirectories establecida en true, FileSystemWatcher ignorará los eventos. Sin embargo, si hay subdirectorios en el directorio de destino, IncludeSubdirectories establecidos en true funcionarán como se espera.
Lo que siempre funcionará si IncludeSubdirectories está configurado en falso. En este caso, FileSystemWatcher solo observará el directorio de destino.
Espero que esto sea útil para los programadores que deseen utilizar Mono en diferentes sistemas operativos e invocar el tipo FileSystemWatcher.
chickenSandwich
He leído en otro lugar que el FileSystemWatcher no funciona con los sistemas de ficheros de Linux cuando se ejecuta en un entorno Mono. Gracias sin embargo. – Luke
El problema con inotify es que no es portátil b/c, solo existe en Linux y no en Unix en general. –
Beagle usa inotify, por lo que definitivamente está envuelto en Mono en alguna parte. –