¿Hay algo parecido a inotify en Windows?

102

Con el sistema operativo Linux, existe el subsistema ionotify que notifica a una aplicación de cambios en el sistema de archivos.

Sin embargo, soy principalmente un usuario de Windows, por lo que me preguntaba si existe una forma similar de monitorear los cambios en el sistema de archivos.

Johansson
fuente
9
No creo que esas preguntas estén fuera de tema. La pregunta solicita una API de SO que es muy diferente a cualquier herramienta / biblioteca de software. Puede ser que se pueda redactar de manera diferente, como recibir notificaciones en una aplicación de Windows cuando se modifican archivos o archivos en particular.
balki
1
Votado para reabrir: la pregunta es pedir una alternativa comparable a una API de sistema operativo específico y me dice de manera figuatoria: "Soy de Inglaterra, donde uso un tenedor para comer, en Japón, ¿qué utensilio uso de manera similar? " La respuesta aceptada usando esa analogía es "usa palillos".
David

Respuestas:

42

Si está usando .net , use FileSystemWatcher. Más información aquí: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

Si estás usando C , uso FindFirstChangeNotification, FindNextChangeNotification, ReadDirectoryChangesW. Más información aquí: http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

En OSX , la api relevante es la fseventsapi.

Todos son sutilmente diferentes entre sí, y todos tienen una confiabilidad cuestionable en casos extremos. En general, no puede depender de estas apis para obtener una vista completa de todos los cambios el 100% del tiempo. La mayoría de las personas que utilizan el monitoreo del sistema de archivos lo combinan con escaneos periódicos para compensar la información perdida o incompleta de la API push.

Blucz
fuente
6
¿Puede dar alguna cita sobre la "confiabilidad cuestionable en caso de borde para inotify?
Pharaun
18
Si un consumidor de una api fs watcher es más lento para leer eventos que algún otro proceso para generarlos, el kernel necesita mantener las modificaciones del sistema de archivos en el otro proceso (posiblemente de mayor prioridad) o permitir el crecimiento ilimitado del búfer. La profundidad del búfer de inotify (como se documenta en la página del manual) está controlada por / proc / sys / fs / inotify / max_queued_events. Más allá de esto, recibe una notificación IN_Q_OVERFLOW; esto es bueno, pero aún se encuentra en una situación en la que es posible que deba volver a escanear de vez en cuando.
Blucz
Ajá, hace poco estuve leyendo en la cola. Creo que este caso extremo dependería de la cantidad de archivos que esté monitoreando y también depende de si es fundamental realizar un seguimiento de todos los cambios o si se pueden perder algunos. Pero ese es un buen punto. Gracias :)
Pharaun
@blucz Me preguntaba cómo la gente del kernel resuelve estas situaciones. Es bueno saber que hacen esto, hace que uno tenga más confianza en el diseño y la implementación.
n611x007
11

JNotify o FileMon de Microsoft.

Eugenio
fuente
8
JNotify fue perfecto para mí porque necesitaba compatibilidad multiplataforma. Incluso pude escribir un solo script bash que funcionó en cygwin, mac y linux suponiendo solo que JAVA_HOME se configuró correctamente. Esto ha sido de gran ayuda para depurar problemas en las máquinas de los clientes, cuando dicen "¡borró mi archivo!" De hecho, puedo mirar el registro e intentar averiguar cómo y cuándo sucedió.
cmyers
1
FileMon ahora es ProcessMonitor technet.microsoft.com/en-us/sysinternals/bb896645
MECU
10

Un poco tarde pero ...

Windows tiene una función similar a los eventos de OSX mediante la cual puede monitorear eventos sin ejecutar una aplicación. Windows USN Journal realiza un seguimiento de todos los cambios en los archivos. Jeffrey Richter (autor de Advanced Windows) escribió un excelente artículo con ejemplos de trabajo para MSDN Journal. Actualización : artículo ahora de archive.org ya que MSJ ya no está en línea en MS.

Documentación de MSDN para diarios de cambios de USN.

Los diarios de cambios de USN probablemente sean mejores si está creando aplicaciones como herramientas de respaldo o índices que necesitan monitorear volúmenes completos.

Peter Krnjevic
fuente
Si el USN Journal es diferente, confiar en él evita el comportamiento erróneo de FileSystemWatcher| FindFirstChangeNotification PhillipBrandonHolmes estaba hablando ?
n611x007
4
Ha pasado un tiempo desde que trabajé con esto, pero no usa FileSystemWatcher o FindFirstChangeNotification. Comencé a escribir un observador de eventos de Windows en Go, basado en gran medida en los ejemplos de Jeffery Richter. Por las pruebas que hice, es sólido como una roca y no se pierde nada, similar a fsevents en OS X. Gist está aquí: gist.github.com/pkrnjevic/7219861
Peter Krnjevic
@PeterKrnjevic ¿Puede actualizar el enlace del artículo de Jeffrey Richter?
SOUser
@SOUser, debido a MS bitrot, el artículo ahora está vinculado desde archive.org.
Peter Krnjevic
3

FileSystemWatcher () no es confiable principalmente debido al hecho de que su manejo de errores para el búfer del observador es más o menos incompleto. Debido a la falta de ruta e información detallada sobre el manejo de errores, Microsoft no le brinda forma de recuperar o sondear manualmente el directorio de trabajo.

El JNotify para Windows tampoco es confiable porque este error ^ deriva de win32. JNotify usa win32. Entonces, no es diferente a FileSystemWatcher ().

Phillip Brandon Holmes
fuente
pensando en cómo diseñar roles para resolver este problema similar a la 'velocidad' / 'carrera' / 'desbordamiento', me preguntaba cómo lo hacían los núcleos. Interesante. Esto también ocurre con las redes y el registro. ¿Este problema tiene nombre?
n611x007
Sí, su nombre es "error". El error (win32) se ha dejado en todos los sistemas operativos creados por Microsoft hasta la fecha. Esto hace que cualquier sistema operativo de Microsoft no sea apto para una solución de tipo de observación de archivos. Tienes que ir * nix para lograrlo. A veces creo que han dejado este desbordamiento de búfer intencionalmente por razones de seguridad.
Phillip Brandon Holmes
jaja ... sí ... su nombre es kludge de clúster intencional para que el sistema de archivos de Microsoft no se pueda ver intencionalmente. Es un error que dejaron debido a problemas de seguridad.
Phillip Brandon Holmes
1

Hice un poco de búsqueda, creo recordar haber visto algo similar para Windows. Existe FileSystemWatcher para .NET. Es principalmente para NT o XP y versiones posteriores.

Pharaun
fuente
En general, solo está disponible en sistemas de archivos NTFS, pero no en FAT16, FAT32 o incluso en el nuevo exFAT.
Mastacheata