Pregunta

En Windows, hay una manera fácil de saber si una carpeta tiene un subarchivo que ha cambiado?

He verificado, y la última fecha de modificación en la carpeta no se actualiza cuando un subarchivo cambios.

Hay una entrada de registro, puedo establecer que modificar este comportamiento?

Si importa, estoy utilizando un volumen NTFS.

Me gustaría, en última instancia, tienen esta capacidad a partir de un programa de C++.

El escaneo de todo un directorio de forma recursiva no funcionará para mí debido a que la carpeta es demasiado grande.

Actualización:Realmente necesito una manera de hacer esto sin un proceso que se ejecuta mientras se produce el cambio.Por lo que instalar un archivo de system watcher no es el mejor para mí.

Update2:El bit de archivo también no funciona porque tiene el mismo problema que el de la última fecha de modificación.El archivo de archivo de bits se pueden establecer, pero las carpetas no.

¿Fue útil?

Solución

Este artículo debe ayudar.Básicamente, puede crear uno o más objeto de notificación, tales como:

HANDLE dwChangeHandles[2]; 
dwChangeHandles[0] = FindFirstChangeNotification( 
      lpDir,                          // directory to watch 
      FALSE,                          // do not watch subtree 
      FILE_NOTIFY_CHANGE_FILE_NAME);  // watch file name changes 

   if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) 
   {
     printf("\n ERROR: FindFirstChangeNotification function failed.\n");
     ExitProcess(GetLastError()); 
   }

// Watch the subtree for directory creation and deletion.  
   dwChangeHandles[1] = FindFirstChangeNotification( 
      lpDrive,                       // directory to watch 
      TRUE,                          // watch the subtree 
      FILE_NOTIFY_CHANGE_DIR_NAME);  // watch dir name changes 

   if (dwChangeHandles[1] == INVALID_HANDLE_VALUE) 
   {
     printf("\n ERROR: FindFirstChangeNotification function failed.\n");
     ExitProcess(GetLastError()); 
   }

y luego esperar a que una notificación:

 while (TRUE) 
   { 
   // Wait for notification. 
      printf("\nWaiting for notification...\n");

      DWORD dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, 
         FALSE, INFINITE); 

      switch (dwWaitStatus) 
      { 
         case WAIT_OBJECT_0: 

         // A file was created, renamed, or deleted in the directory.
         // Restart the notification. 
             if ( FindNextChangeNotification(dwChangeHandles[0]) == FALSE )
             {
               printf("\n ERROR: FindNextChangeNotification function failed.\n");
               ExitProcess(GetLastError()); 
             }
             break; 

         case WAIT_OBJECT_0 + 1: 

         // Restart the notification. 
             if (FindNextChangeNotification(dwChangeHandles[1]) == FALSE )
             {
               printf("\n ERROR: FindNextChangeNotification function failed.\n");
               ExitProcess(GetLastError()); 
             }
             break; 

         case WAIT_TIMEOUT:

         // A time-out occurred. This would happen if some value other 
         // than INFINITE is used in the Wait call and no changes occur.
         // In a single-threaded environment, you might not want an
         // INFINITE wait.

            printf("\nNo changes in the time-out period.\n");
            break;

         default: 
            printf("\n ERROR: Unhandled dwWaitStatus.\n");
            ExitProcess(GetLastError());
            break;
      }
   }
}

Otros consejos

Esta es quizás una exageración, pero la IFS kit de MS o de la FDDK de OSR podría ser una alternativa.Crear su propio sistema de archivos controlador de filtro con el simple seguimiento de todos los cambios en el sistema de ficheros.

ReadDirectoryChangesW

Excelente ejemplo de código en este artículo en CodeProject

Si usted no puede ejecutar un proceso, cuando el cambio se produce, entonces no hay mucho que se pueda hacer, excepto escanear el sistema de ficheros, y comprobar la fecha y hora de modificación.Esto requiere de usted para guardar cada archivo de la última fecha/tiempo, sin embargo, y comparar.

Usted puede acelerar este proceso mediante el uso de la bit de archivo (aunque puede estropear su software de copia de seguridad, por lo que proceder con cuidado).

Un bit de archivo es un archivo de atributo presente en muchos sistemas de archivos, en particular, FAT, FAT32 y NTFS.El el propósito de un bit de archivo de pista los cambios incrementales a los archivos de la finalidad de la copia de seguridad, también llamado el archivado.

Como el bit de archivo binario bits, es 1 o 0, o en este caso más llama con frecuencia de ajuste (1) y claro (0).El sistema operativo establece el de bits del archivo en cualquier momento que un archivo es creado, movido, cambiado de nombre, o de lo contrario modificado de ninguna manera.El bit de archivo por lo tanto, representa uno de los dos estados:"cambiado" y "no ha cambiado" desde la última copia de seguridad.

Archivo de bits no son afectados por de la simple lectura de un archivo.Cuando un archivo es la copia, el archivo original del archivo poco no se ve afectada, sin embargo, la copia de la bit de archivo será en el tiempo la copia.

Por lo que el proceso sería:

  1. Borrar el bit de archivo a todos los archivos
  2. Deje que el cambio de sistema de archivos a lo largo del tiempo
  3. Un análisis de todos los archivos de cualquier con el conjunto de bits del archivo ha cambiado

Esto eliminará la necesidad de su programa para mantener el estado, y ya que sólo va a través de las entradas de directorio (donde el bit se almacena) y que se agrupan, debe ser muy, muy rápido.

Si usted puede ejecutar un proceso durante los cambios, sin embargo, entonces usted querrá buscar en el FileSystemWatcher clase.He aquí un ejemplo cómo podría usarlo.

También existe en .NET (para el futuro de las búsquedas de los usuarios de este tipo de problema)

Tal vez usted puede dejar a un proceso que se ejecuta en la máquina de la observación de cambios y la creación de un archivo para leer más tarde.

-Adam

Tal vez usted puede utilizar el NTFS 5 Cambio Diario con DeviceIoControl como se explica aquí

Si usted no se opone al uso .NETO de la FileSystemWatcher la clase se hará cargo de esto para usted con bastante facilidad.

Desde el doble post, alguien mencionó:Receptor de Eventos de WMI

Todavía en busca de una mejor respuesta, aunque.

Nada fácil si usted tiene una aplicación en ejecución, puede utilizar el archivo Win32 notificación de cambio de api (FindFirstChangeNotification) como se sugirió con las otras respuestas.advertencia:circa 2000 trend micro antivirus en tiempo real sería el grupo de los cambios juntos lo que será necesario utilizar realmente grandes buffers, al solicitar el cambio de sistema de archivos de las listas.

Si usted no tiene una aplicación en ejecución, usted puede dar vuelta en ntfs en el diario y el scan de la revista para los cambios http://msdn.microsoft.com/en-us/library/aa363798(VS.85).aspx pero esto puede ser más lento que el escaneo de todo el directorio, cuando el número de cambios es mayor que el número de archivos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top