Wie zu sehen, wenn eine Subdatei eines Verzeichnisses geändert hat
-
09-06-2019 - |
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.
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
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:
- Deaktivieren Sie das Archiv-Bit für alle Dateien
- die Dateisystemänderung im Laufe der Zeit Let
- 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