tagger tag puddletag mp3tag .net linux file-io

.net - mp3tag - puddletag



¿Existe un equivalente a.Net FileSystemWatcher en el mundo de Linux? (5)

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

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

Si el kernel del sistema operativo admite la visualización de directorios (inotify en Linux, KEvents en BSD u OSX) se utiliza esa característica; De lo contrario, recurre al uso de las bibliotecas Gamin o FAM (estas bibliotecas proporcionan una API para monitorear directorios) y si ninguna de esas características está disponible, Mono sondeará cada 750 milisegundos que los directorios vieron.

Puede forzar el comportamiento de sondeo (en lugar de usar la compatibilidad con kernel) configurando la variable de entorno MONO_MANAGED_WATCHER antes de ejecutar su aplicación. Esto podría ser útil para los sistemas de archivos que no son compatibles con inotify y aún requieren un sondeo para detectar cambios ".

Encuentro la clase .Net FileSystemWatcher 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)?

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



Sí, dnotify e inotify .

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


Si está utilizando la maravillosa biblioteca QT (www.qtsoftware.com), está incluida como QFileSystemWatcher.


Saludos, me gustaría compartir mis observaciones usando FileSystemWatcher en Mono en Ubuntu 10.10. Aquí hay una implementación muy 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); } } }

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.

sándwich de pollo