检查每个文件的存档位的现有备份方法可能会变得缓慢且缓慢对于大型文件系统效率低下。此方法需要扫描所有文件,包括临时文件,并可能导致冗长的备份过程。
更有效的方法涉及使用文件系统 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中文网其他相关文章!