使用 FSCTL_ENUM_USN_DATA 高效检测 NTFS 卷上的文件更改
背景
检查每个文件的存档位的现有备份方法可能会变得缓慢且缓慢对于大型文件系统效率低下。此方法需要扫描所有文件,包括临时文件,并可能导致冗长的备份过程。
使用文件系统 USN 的替代方法
更有效的方法涉及使用文件系统 USN(更新序列)号)更改日志。文件系统 USN 提供对文件系统所做的每个更改的记录,包括文件创建、删除和修改。
FSCTL_ENUM_USN_DATA 的工作原理
要检测 NTFS 卷上的更改,我们可以利用FSCTL_ENUM_USN_DATA 控制代码。此控制代码:
- 枚举卷上的所有文件,仅包括当前存在的文件。
-
检索每个文件的关键数据,包括:
- 文件标志
- USN
- 文件名
- 父文件参考号
实施更改检测
检测更改:
- 获取文件系统 USN 数据:使用 FSCTL_QUERY_USN_JOURNAL 获取系统的最大 USN (maxusn)。
- 枚举 USN 记录: 使用 FSCTL_ENUM_USN_DATA 循环遍历 USN 记录。
- 识别相关记录: 检查标志并比较 USN 以检测创建、删除或修改的文件。
- 解析父路径:将父文件参考号与目录的文件参考号匹配,以获得完整的文件路径。
C 代码示例
这是演示该方法的代码片段:
<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 RecordLength); } mft_enum_data.StartFileReferenceNumber = nextid; }</code>
性能注意事项
使用 FSCTL_ENUM_USN_DATA 的方法提供:
- 快速枚举过程: 每秒能够处理超过 6000 条记录。
- 高效过滤: 仅分析相关的文件更改记录,消除临时文件的开销。
- 潜力限制: 在非常大的卷上性能可能会有所不同,但它通常比检查存档位更有效。
附加说明
- 在 Windows 上将 MFT_ENUM_DATA 替换为 MFT_ENUM_DATA_V0 Windows 7 之后的版本。
- 文件参考号打印为 32 位,这是一个错误。在生产代码中,建议使用 64 位值。
以上是如何使用 FSCTL_ENUM_USN_DATA 有效检测 NTFS 卷上的文件更改?的详细内容。更多信息请关注PHP中文网其他相关文章!

本文解释了C标准模板库(STL),重点关注其核心组件:容器,迭代器,算法和函子。 它详细介绍了这些如何交互以启用通用编程,提高代码效率和可读性t

本文详细介绍了c中有效的STL算法用法。 它强调了数据结构选择(向量与列表),算法复杂性分析(例如,std :: sort vs. std vs. std :: partial_sort),迭代器用法和并行执行。 常见的陷阱

本文讨论了C中的动态调度,其性能成本和优化策略。它突出了动态调度会影响性能并将其与静态调度进行比较的场景,强调性能和之间的权衡

C 20范围通过表现力,合成性和效率增强数据操作。它们简化了复杂的转换并集成到现有代码库中,以提高性能和可维护性。

本文讨论了使用C中的移动语义来通过避免不必要的复制来提高性能。它涵盖了使用std :: Move的实施移动构造函数和任务运算符,并确定了关键方案和陷阱以有效

本文详细介绍了C中的有效异常处理,涵盖了尝试,捕捉和投掷机制。 它强调了诸如RAII之类的最佳实践,避免了不必要的捕获块,并为强大的代码登录例外。 该文章还解决了Perf

文章讨论了在C中有效使用RVALUE参考,以进行移动语义,完美的转发和资源管理,重点介绍最佳实践和性能改进。(159个字符)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Dreamweaver Mac版
视觉化网页开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3 Linux新版
SublimeText3 Linux最新版