c++ - 如何检测 win32 NTFS 下的文件移动?

标签 c++ visual-studio winapi visual-c++ ntfs

我有一个数据库,允许将附加信息附加到文件系统 (NTFS) 中的任何文件。文件 ID 是其完整路径,因此为了保持一致性,我需要查看数据库中的任何文件是否被删除、重命名或移动。

目前,我正在尝试通过将 ReadDirectoryChangesW 函数与 FILE_NOTIFY_CHANGE_FILE_NAME | 一起使用来实现这一点 | FILE_NOTIFY_CHANGE_DIR_NAME 作为过滤标准。

问题是这样,我只会收到重命名、创建和删除的通知。因此,我需要根据“添加”和“删除”事件以及相关文件名来猜测何时发生移动(在同一卷上,移动 [ctrl-x, ctrl-v] 实际上是一个文件删除,紧接着是一个文件创建,路径不同,但文件名保持不变。

有人知道是否有更好的解决方案吗?

这是我基于观察的理解:

关于在NTFS下移动文件

在同一卷内

针对相同文件名和不同路径(无论移动文件的大小)的“添加”事件紧跟在“删除”事件之后(几乎没有延迟)。

如果正在监视整个卷的特殊情况:当文件被删除时,它实际上被添加到回收站(路径包含卷回收站但文件名不同 [某种哈希])。

在两个不同的卷之间

首先,目标卷上有一个“已添加”事件。
之后,当复制完成时,原始卷上会出现“已删除”事件。

(注意:同时可能会发生几个事件:文件越大,延迟时间越长。)

最佳答案

如果这些文件在您的控制之下(如果您在添加到数据库时具有写入权限,那么您始终至少具有读取权限),我会在替代数据流中通过我的 GUID 或对象 ID 标记它们( https://msdn.microsoft.com/en-us/library/aa364557%28v=VS.85%29.aspx ),无论哪个更合适。

关于c++ - 如何检测 win32 NTFS 下的文件移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35242661/

相关文章:

c++ - VC++ 编译器/源字符集 :utf-8 doesn't work

C++:临时参数的生命周期?

visual-studio - 意外的SVN checkin

c++ - 如何在 LSP 中找出确切的 URL?

c++ - 复杂错误 LNK2005 : already defined C++

macos - 让 NUnit 测试在 Visual Studio Team Services(Mac 构建代理)上运行

c++ - 具有多个窗口的应用程序作为类的实例,C++

c - RegQueryValueEx()读取REG_DWORD时总是在*lpData中填0

c - 未定义对 "sleep"的引用,但我确实包含了 <unistd.h>

c++ - 在 C++ 中逐行读取字符串然后读取 int