如何使用 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 提交?