Frage

In Windows gibt es eine einfache Möglichkeit, zu sagen, ob ein Ordner verfügt über eine Subdatei, dass sich geändert hat?

Ich habe überprüft, und das Letzte änderungsdatum der Ordner wird nicht aktualisiert, wenn eine Subdatei-änderungen.

Gibt es einen registry-Eintrag, den ich einstellen kann, dass dieses Verhalten ändern?

Wenn es darauf ankommt, bin ich über ein NTFS-volume.

Ich würde nämlich gerne diese Fähigkeit aus einem C++ - Programm.

Scannen einer ganzen Verzeichnis rekursiv wird bei mir nicht funktioniert, weil der Ordner ist viel zu groß.

Update:Ich brauche wirklich einen Weg, dies zu tun, ohne einen Laufenden Prozess, während die änderung Eintritt.So installieren Sie einen Dateisystem-watcher ist nicht optimal für mich.

Update2:Das Archiv-bit wird auch nicht funktionieren, denn es hat das gleiche problem wie dem Datum der letzten änderung.Die Datei Archiv-bit gesetzt werden, aber der Ordner wird nicht.

War es hilfreich?

Lösung

Das Artikel sollte helfen. Grundsätzlich Sie eine oder mehrere Benachrichtigungsobjekt erstellen, wie:

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()); 
   }

und Sie dann warten Sie auf eine Meldung:

 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;
      }
   }
}

Andere Tipps

Dies ist vielleicht übertrieben, aber die IFS Kit von MS oder FDDK von OSR könnte eine Alternative sein. Erstellen Sie Ihre eigenen Dateisystem-Filtertreiber mit einfacher Überwachung aller Änderungen am Dateisystem.

ReadDirectoryChangesW

Einige ausgezeichnete Beispielcode in diesem Artikel Codeproject

Wenn Sie keinen Prozess ausgeführt werden, wenn die Änderung eintritt, dann gibt es nicht viel Sie außer scannen das Dateisystem zu tun, und überprüfen Sie die Änderung Datum / Uhrzeit. Dies erfordert, dass Sie jede letzte Datum / Uhrzeit der Datei zu speichern, obwohl, und vergleichen.

Sie können diese mithilfe des Archivbits (obwohl es kann mess up beschleunigen Ihre Backup-Software, so vorsichtig vorgehen).

  

Ein Archiv-Bit ist ein Dateiattribut   in vielen Computer-Dateisysteme,   insbesondere FAT, FAT32 und NTFS. Das   Zweck eines Archivs Bit zu verfolgen   inkrementelle Änderungen an Dateien für die   Zweck der Sicherung, die auch als   Archivierung.

     

Da der Archiv-Bit ist ein binäres Bit, es   entweder 1 oder 0 ist, oder in diesem Fall mehr   Häufig genannte Satz (1) und klarer   (0). Das Betriebssystem setzt die   Archiv-Bit jederzeit eine Datei   erstellt, verschoben, umbenannt oder auf andere Weise   in keiner Weise verändert. Der Archiv-Bit   daher stellt eine von zwei   heißt es: „geändert“ und „nicht geändert“   seit der letzten Sicherung.

     

Archiv Bits sind nicht betroffen durch   einfach das Lesen einer Datei. Wenn eine Datei   kopiert, Archiv der Originaldatei   Bit ist nicht betroffen, aber die Kopie des   Archiv-Bit wird zu dem Zeitpunkt festgelegt werden   die Kopie gemacht wird.

So der Prozess wäre:

  1. Deaktivieren Sie das Archiv-Bit für alle Dateien
  2. die Dateisystemänderung im Laufe der Zeit Let
  3. Scan alle Dateien - jede mit dem Archiv-Bit gesetzt haben sich geändert

Dies wird die Notwendigkeit für Ihr Programm beseitigen Zustand zu halten, und da Sie nur über die Verzeichniseinträge fahren (wo das Bit gespeichert sind) und sie gruppiert sind, sollte es sehr, sehr schnell.

Wenn Sie einen Prozess während der Änderungen ausgeführt werden können, aber dann werden Sie in der Filesystemwatcher Klasse. Hier ist ein Beispiel , wie Sie es verwenden könnte .

Es existiert auch in . NET (für zukünftige Forscher dieser Art von Problem)

Vielleicht können Sie verlassen ein Prozess auf dem Computer ausgeführt wird für Änderungen beobachten und das Erstellen einer Datei für Sie später zu lesen.

-Adam

Vielleicht können Sie die NTFS 5 Change Journal mit DeviceIoControl verwenden, wie erklärt hier

Wenn Sie nicht auf die Verwendung .NET die Filesystemwatcher Klasse wird dies ziemlich leicht für Sie.

Von der Doppelpost jemand erwähnt: WMI Event Sink

Noch für eine bessere Antwort suchen though.

Im Moment einfach - wenn Sie eine laufende Anwendung, die Sie die Win32-Dateiänderungsbenachrichtigung Apis verwenden können (FindFirstChangeNotification) als mit den anderen Antworten vorgeschlagen. Warnung: circa 2000 Trend Micro in Echtzeit Viren-Scanner würden zusammen die Änderungen Gruppe was es notwendig macht wirklich große Puffer zu verwenden, wenn die Dateisystemänderungslisten anfordernden

.

Wenn Sie nicht über eine laufende App haben, können Sie auf ntfs Journaling drehen und die Zeitschrift für Änderungen scannen

scroll top