Buscar files cambiados

Estoy buscando un buen método eficiente para escanear una estructura de directorys para files modificados en Windows XP +. Algo así como lo hace git es exactamente lo que estoy buscando, cuando ejecuto un git status , muestra todos los files modificados, todos los files nuevos (sin seguimiento) y los files eliminados muy rápidamente, que es exactamente lo que me gustaría hacer.

Tengo un model básico en funcionamiento que realiza un escaneo inicial y almacena todos los nombres de file, tamaño, dates y attributes.

En un escaneo posterior, verifica si el tamaño, los attributes o la date han cambiado y las marcas como un file modificado.

Mi problema ahora es detectar files movidos y eliminados. ¿Hay un método probado para este tipo de cosas? Estoy luchando por encontrar un buen método.

Debo mencionar que eventualmente usará ReadDirectoryChangesW para monitorear files y alertar al usuario cuando algo cambia, por lo que un escaneo completo es realmente el último recurso después del escaneo inicial.

Gracias, J

EDITAR: Creo que puedo haber descrito el problema mal. El problema al que me enfrento no es tanto la detección de los cambios: tengo ReadDirectoryChangesW() usando IOCP en varios subprocesss para detectar cuando ocurre un cambio, el problema es más qué hacer con la información. Por ejemplo, un file movido se informa como una eliminación seguida de una creación y un cambio de nombre viene en 2 partes, nombre antiguo, seguido de un nuevo nombre. Entonces, lo que estoy preguntando es cómo diferenciar entre la eliminación como parte de un movimiento y una eliminación real. Supongo que almacenar los cambios y procesar lotes sería una opción, pero se siente desorderado.

En el código nativo FileSystemWatcher se reemplaza por ReadDirectoryChangesW . Usar esto correctamente no es simple, hay una buena base para build aquí .

He usado este código en un trabajo anterior y funcionó bastante bien. La API de Win32 en sí (y FileSystemWatcher ) son propensos a los problemas que se describen en los documentos y también se discuten en varios lugares en línea, pero el impacto de estos dependerá de sus casos de uso.

EDITAR: el cambio exacto se indica en la estructura FILE_NOTIFY_INFORMATION que recibe de vuelta: agrega, elimina, renombra datos, incluidos los nombres antiguos y nuevos.

Yo voté por Liviu M. Sin embargo, otra opción si no desea utilizar .NET Framework por alguna razón, sería utilizar la llamada básica de Win32 API FindFirstChangeNotification .

Puede usar el diario USN si está preparado, es bastante bajo nivel (nivel NTFS).

Aquí puede encontrar información detallada y el código fuente incluido. Está escrito en C # pero la mayor parte se trata de funciones Invocantes C / C ++.