檢查每個檔案的存檔位的現有方法可能會變備份方法可能會變備份得緩慢且緩慢對於大型檔案系統效率低。此方法需要掃描所有文件,包括臨時文件,並可能導致冗長的備份過程。
更有效的方法涉及使用檔案系統 USN(更新序列)號碼)來變更日誌。檔案系統 USN 提供對檔案系統所做的每個變更的記錄,包括檔案建立、刪除和修改。
要檢測 NTFS 磁碟區上的更改,我們可以利用FSCTL_ENUM_USN_DATA 控制碼。此控制碼:
檢索每個文件的關鍵數據,包括:
偵測變更:
這是示範此方法的程式碼片段:
<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>
使用FSCTL_ENUM_USN_DATA 的方法提供:
以上是如何使用 FSCTL_ENUM_USN_DATA 有效檢測 NTFS 磁碟區上的檔案變更?的詳細內容。更多資訊請關注PHP中文網其他相關文章!