Saltar al contenido

Detectar archivos movidos usando FileSystemWatcher

El paso a paso o código que verás en este artículo es la solución más fácil y efectiva que hallamos a esta duda o dilema.

Solución:

Según los documentos:

Las operaciones comunes del sistema de archivos pueden generar más de un evento. Por ejemplo, cuando un archivo se mueve de un directorio a otro, pueden generarse varios eventos OnChanged y algunos OnCreated y OnDeleted. Mover un archivo es una operación compleja que consta de múltiples operaciones simples, por lo que genera múltiples eventos.

Entonces, si está tratando de ser muy cuidadoso al detectar movimientos, y tener la misma ruta no es lo suficientemente bueno, tendrá que usar algún tipo de heurística. Por ejemplo, cree una “huella digital” usando el nombre del archivo, el tamaño, la hora de la última modificación, etc. para los archivos en la carpeta de origen. Cuando vea cualquier evento que pueda indicar un movimiento, verifique la “huella digital” contra el nuevo archivo.

Según tengo entendido, el Renamed evento es para los archivos que se mueven…?

Mi error: los documentos dicen específicamente que solo los archivos dentro de una carpeta movida se consideran “renombrados” en una operación de cortar y pegar:

El sistema operativo y el objeto FileSystemWatcher interpretan una acción de cortar y pegar o una acción de mover como una acción de cambio de nombre para una carpeta y su contenido. Si corta y pega una carpeta con archivos en una carpeta que se está observando, el objeto FileSystemWatcher informa solo la carpeta como nueva, pero no su contenido porque, en esencia, solo se les cambia el nombre.

También dice acerca de mover archivos:

Las operaciones comunes del sistema de archivos pueden generar más de un evento. Por ejemplo, cuando un archivo se mueve de un directorio a otro, pueden generarse varios eventos OnChanged y algunos OnCreated y OnDeleted. Mover un archivo es una operación compleja que consta de múltiples operaciones simples, por lo que genera múltiples eventos.

Como ya mencionó, no hay una forma confiable de hacer esto con la clase FileSystemWatcher predeterminada proporcionada por C#. Puede aplicar ciertas heurísticas como nombre de archivo, hash o identificadores de archivo únicos para mapear eventos creados y eliminados juntos, pero ninguno de estos enfoques funcionará de manera confiable. Además, no puede obtener fácilmente el hash o la identificación del archivo asociado con el evento eliminado, lo que significa que debe mantener estos valores en algún tipo de base de datos.

Creo que el único enfoque confiable para detectar movimientos de archivos es crear un observador del sistema de archivos propio. Por lo tanto, puede utilizar diferentes enfoques. Si solo va a ver los cambios en los sistemas de archivos NTFS, una solución podría ser leer el diario de cambios de NTFS como se describe aquí. Lo bueno de esto es que incluso le permite realizar un seguimiento de los cambios que ocurrieron mientras su aplicación no se estaba ejecutando.

Otro enfoque es crear un controlador de minifiltro que rastree las operaciones del sistema de archivos y las reenvíe a su aplicación. Al usar esto, básicamente obtiene toda la información sobre lo que está sucediendo con sus archivos y podrá obtener información sobre los archivos movidos. Un inconveniente de este enfoque es que debe crear un controlador independiente que debe instalarse en el sistema de destino. Sin embargo, lo bueno es que no necesitarías comenzar desde cero, porque ya comencé a crear algo como esto: https://github.com/CenterDevice/MiniFSWatcher

Esto le permite simplemente rastrear archivos movidos como este:

var eventWatcher = new EventWatcher();

eventWatcher.OnRenameOrMove += (filename, oldFilename, process) =>

  Console.WriteLine("File " + oldFilename + " has been moved to " + filename + " by process " + process );
;

eventWatcher.Connect();
eventWatcher.WatchPath("C:\Users\MyUser\*");

Sin embargo, tenga en cuenta que esto requiere un código de kernel que debe firmarse para ejecutarse en la versión de Windows de 64 bits (si no desactiva la comprobación de firmas para las pruebas). En el momento de escribir este artículo, este código también se encuentra todavía en una etapa temprana de desarrollo, por lo que me gustaría no usarlo en los sistemas de producción todavía. Pero incluso si no va a usar esto, aún debería brindarle información sobre cómo se pueden rastrear los eventos del sistema de archivos en Windows.

Reseñas y valoraciones del post

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *