我有一个数据库,允许将附加信息附加到文件系统 (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/