Heim > Artikel > Backend-Entwicklung > Wie können Sie Dateiänderungen auf einem NTFS-Volume mithilfe von FSCTL_ENUM_USN_DATA effizient erkennen?
Bestehende Sicherungsmethoden, die das Archivbit jeder Datei überprüfen, können langsam und langsam werden ineffizient für große Dateisysteme. Dieser Ansatz erfordert das Scannen aller Dateien, einschließlich temporärer Dateien, und kann zu langwierigen Sicherungsvorgängen führen.
Eine effizientere Methode ist die Verwendung der Dateisystem-USN (Update Sequence). Nummer) Änderungsjournal. Das Dateisystem USN stellt einen Datensatz für jede am Dateisystem vorgenommene Änderung bereit, einschließlich der Erstellung, Löschung und Änderung von Dateien.
Um Änderungen auf einem NTFS-Volume zu erkennen, können wir das verwenden FSCTL_ENUM_USN_DATA Steuercode. Dieser Steuercode:
Ruft kritische Daten für jede Datei ab, einschließlich:
Um Änderungen zu erkennen:
Hier ist ein Codeausschnitt, der den Ansatz demonstriert:
<code class="c++">DWORDLONG nextid; DWORDLONG filecount = 0; DWORD starttick, endtick; // Allocate memory for USN records void * buffer = VirtualAlloc(NULL, BUFFER_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); // Open volume handle HANDLE drive = CreateFile(L"\\?\c:", GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_FLAG_NO_BUFFERING, NULL); // Get volume USN journal data USN_JOURNAL_DATA * journal = (USN_JOURNAL_DATA *)buffer; if (!DeviceIoControl(drive, FSCTL_QUERY_USN_JOURNAL, NULL, 0, buffer, BUFFER_SIZE, &bytecount, NULL)) { (...) } maxusn = journal->MaxUsn; MFT_ENUM_DATA mft_enum_data; mft_enum_data.StartFileReferenceNumber = 0; mft_enum_data.LowUsn = 0; mft_enum_data.HighUsn = maxusn; while (...) { if (!DeviceIoControl(drive, FSCTL_ENUM_USN_DATA, &mft_enum_data, sizeof(mft_enum_data), buffer, BUFFER_SIZE, &bytecount, NULL)) { (...) } nextid = *((DWORDLONG *)buffer); USN_RECORD * record = (USN_RECORD *)((USN *)buffer + 1); USN_RECORD * recordend = (USN_RECORD *)(((BYTE *)buffer) + bytecount); while (record < recordend) { filecount++; // Check flags and USNs to identify changes (...) record = (USN_RECORD *)(((BYTE *)record) + record->RecordLength); } mft_enum_data.StartFileReferenceNumber = nextid; }</code>
Der Ansatz mit FSCTL_ENUM_USN_DATA bietet:
Das obige ist der detaillierte Inhalt vonWie können Sie Dateiänderungen auf einem NTFS-Volume mithilfe von FSCTL_ENUM_USN_DATA effizient erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!