2010-03-27 16 views
5

Necesito generar un evento cuando otro archivo cierra un archivo.Monitorear archivos similares a System Internal's/Microsoft FileMon/Process Monitor

Desafortunadamente, ReadDirectoryChangesW no informa el evento de cierre. Sería posible para mí sondear (con un TTimer) cualquier archivo que informara ReadDirectoryChangesW como modificado, esperando a que se cierre (usando CreateFile para detectar esto).

Sin embargo, lo que prefiero es una solución completamente orientada a eventos.

¿Hay alguna forma de conectar las llamadas al sistema y detectar todos los eventos de cierre de archivos? Simplemente quiero saber la ruta & nombre de cualquier archivo que acaba de cerrarse.

+1

¿Tiene alguna idea de por qué los cambios de índices de objetos no le da el evento? Esto normalmente debería funcionar sin ningún problema en ninguna unidad local y extraíble (y con más frecuencia incluso en cualquier unidad de red). Alguna vez has probado las rutinas de notificación de cambios del explorador: SHChangeNotifyRegister? –

+1

No quiere que se detecte que el identificador del archivo se haya cerrado, no se haya eliminado el archivo. ReadDirectoryChangesW no proporciona ese evento. – Runner

Respuesta

7

No existe una buena solución simple para su problema solo en Delphi: la verdadera solución es escribir un filter driver para supervisar los eventos de cierre de archivos.

5

Usted debe echar un vistazo a Mathias Rauens madCodeHook:

madCodeHook ofrece todo lo necesario para enganchar código (en su mayoría API) en los 32 y 64 bits de Windows sistemas operativos desde Windows 95 a Windows 7 . Puede elegir si desea conectar las API en su propio proceso, o en un proceso específico de , o en todo el sistema.

-1

Dentro Jedi código de la biblioteca (JCL), tiene un componente llamado 'TJvChangeNotify' donde se puede obtener la notificación cuando un cambio se ha detectado en un directorio monitoreado:

  • Changed ' Última escritura ' => ¡Así que parece ser exactamente lo que quería hacer!

Otras cosas que puede hacer:

  • tamaño de archivo cambiado
  • nombre de archivo modificado ...

Y lo mejor de todo, es buscar dentro de una carpeta con subdirectorios si usted quiere. Aquí hay un enlace a (parte de) archivo de ayuda para este componente: http://help.delphi-jedi.org/item.php?Id=172982

Espero que esto ayude.

+0

La pregunta menciona específicamente por qué esto no es lo que OP busca. – mghie

+0

-1: claramente declaró que esta no era una opción. –

+0

No hay necesidad de ser tan rudo. La pregunta termina con "Simplemente quiero saber la ruta y el nombre de cualquier archivo que se acaba de cerrar", así que traté de responder :) – TridenT

0

Si las notificaciones de cambio no funcionan, podría utilizar un método muy crudo y cojo: sondeo. Cada segundo más o menos, intente abrir el archivo con algunas opciones compartidas incompatibles. En el momento en que esto sucede, usted sabe que la otra aplicación lo ha cerrado.

No es la opción más limpia de lejos, pero funcionará. Esta es solo una opción si necesita monitorear un número limitado de archivos y sus nombres se conocen de antemano.

+0

Eso se menciona en la pregunta como una posible solución (coja), así que ¿por qué repetirlo? – mghie

+1

Acabo de decir lo obvio tal vez, pero creo que los inconvenientes y las imposibilidades del profesional no se han mencionado. Es por eso. –

+0

No menciona ninguna imposibilidad. Es posible monitorear una cantidad ilimitada de archivos de esta manera, cuyos nombres no necesitan ser conocidos de antemano, y el OP lo dice en su pregunta. No menciona la verdadera limitación, es decir, que posiblemente interfiera con otros programas (puede hacer que falle la reapertura de los archivos supervisados). – mghie