如何使用 ReadDirectoryChangesW 区分 ADS(备用数据流)与主流更改

Posted

技术标签:

【中文标题】如何使用 ReadDirectoryChangesW 区分 ADS(备用数据流)与主流更改【英文标题】:How to distinguish ADS (Alternate Data Stream) vs Main stream changes with ReadDirectoryChangesW 【发布时间】:2021-11-29 04:55:25 【问题描述】:

我正在为 Windows 开发文件同步客户端。

我使用ReadDirectoryChangesW API 来检测文件事件(修改、删除、创建等)。

ReadDirectoryChangesW 报告 NTFS ADS 更改与文件修改相同。

例如,当创建 eml 文件时,OS 系统会在此文件上添加 ADS。 (流名称为OECustomProperty)。在这种情况下,My Client 无法区分主流和备用数据流。

如何区分修改ADS和修改主流?

【问题讨论】:

@YakovGalka 例如 A.txt:stream 已修改,ReadDirectoryChangesW 仅接收 A.txt 文件。但是我想接收A.txt:stream被修改了。 我猜windows没有提供任何更精细的粒度。正如我所说,您最好的选择是,当您收到文件的更改时,假设所有关联的流都已更改。 这个问题有解决方案吗?我可以放弃使用ReadDirectoryChangesW 问题是我的客户端收到了修改事件,尽管文件没有被修改(主流)。在这种情况下,我的客户正在尝试上传一个没有被修改(主流)的文件。 ReadDirectoryChangesW 并不是 100% 可靠,所以我认为您可能期望过高 【参考方案1】:

您可以考虑使用多种替代 API。特别是 NTFS 日志,您可以通过它查看和同步自上次访问以来发生的事情。您必须保留上次阅读的期刊标识符...USN...这样您就知道从哪里开始处理。

它有点神秘,但非常有用……尤其是对于备份和同步程序之类的东西。您可以找到进入这个奇妙世界的入口here。

另外,您最好阅读整个 $MSFT(卷目录)而不是遍历文件夹。它也是一个相当神秘的 API,但比遍历文件夹快几个数量级。在我对this question 的回答中有关于如何阅读的描述。

【讨论】:

以上是关于如何使用 ReadDirectoryChangesW 区分 ADS(备用数据流)与主流更改的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?