2008-11-27 4 views
8

Encuentro que la clase .Net FileSystemWatcher es realmente útil para escribir utilidades que cobran vida automáticamente cuando los archivos aparecen en sus carpetas observadas. ¿Hay algún equivalente a esta funcionalidad en el mundo * nix que me permita ver una carpeta (y posiblemente todos sus subdirectorios)?¿Existe un equivalente a .Net FileSystemWatcher en el mundo de Linux?

Editar: Preferiblemente, esto será algo que no requiere parches de kernel.

Respuesta

2

Sí, dnotify y inotify.

No sé si Mono tiene estos envueltos, pero valdría la pena consultarlos.

+0

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

+0

El problema con inotify es que no es portátil b/c, solo existe en Linux y no en Unix en general. –

+0

Beagle usa inotify, por lo que definitivamente está envuelto en Mono en alguna parte. –

6

Como ya se ha dicho esto, Mono tiene la clase "System.IO.FileSystemWatcher", este es el enlace correspondiente:. http://www.go-mono.com/docs/monodoc.ashx?link=T%3aSystem.IO.FileSystemWatcher

"aplicación de la FileSystemWatcher de Mono tiene múltiples backends Esto es necesario porque no todos los sistemas operativos compatibles con Mono tienen todas las características necesarias para proporcionar la funcionalidad esperada por las aplicaciones.

Si el núcleo del sistema operativo admite la visualización de directorios (inotify en Linux, KEvents en BSD u OSX) que se utiliza la característica ; De lo contrario se cae volver a utilizar el Gamin o FAM bibliotecas (estas bibliotecas proporcionan una API para controlar directorios) y si ninguna de esas características están disponibles, Mono sondeará cada 750 milisegundos los directorios supervisados.

Puede forzar el comportamiento de votación (en lugar de utilizar el soporte del kernel) estableciendo la variable de entorno MONO_MANAGED_WATCHER antes de ejecutar su aplicación. Esto podría ser útil para sistemas de ficheros que no son compatibles inotify y todavía requieren ser elegidos a detectar cambios."

2

Si está utilizando la librería QT maravillosa (www.qtsoftware.com) que está incluido como el QFileSystemWatcher .

13

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

Cuestiones relacionadas