如何无需枚举各云服务规则即可判断指定路径是否为云同步文件夹
云同步文件夹通用识别方案
最优通用方案(无需单独适配各云服务规则)
Windows 10 1809及以上版本已经原生提供了云同步目录的系统级标识,所有主流云同步客户端(OneDrive、Google Drive、Dropbox、国内的坚果云、百度云同步盘等)都会主动给同步根目录标注该属性,你可以直接调用系统接口查询,不需要自己维护每个服务的适配规则:
- 核心标识:系统内置属性
System.IsCloudSyncRoot,对应的属性键为PKEY_IsCloudSyncRoot - 调用方法:
- 将目标路径转为
IShellItem2对象 - 调用
IShellItem2::GetBoolean方法传入PKEY_IsCloudSyncRoot参数查询属性值 - 若返回值为真,则该路径属于云同步根目录;你还可以向上遍历目标路径的所有父目录,只要任意一级父目录的该属性为真,即可判定目标路径属于云同步文件夹的子路径
- 将目标路径转为
- 优势:不需要读取注册表、不需要扫描目录下的专属文件,完全依赖系统标准接口,覆盖99%以上主流云同步服务场景
低版本Windows兼容方案
如果需要适配Windows 10 1809以下的系统,可以用轻量通用校验逻辑,也不需要逐个适配各服务的规则:
- 校验逻辑:
- 向上遍历目标路径的所有父目录,直到根目录
- 对每一级父目录,检查是否存在属性为隐藏的专属配置文件,这类文件普遍命名为
.{服务名}或{服务名}.ini,不需要穷举所有服务名,只要匹配命名特征即可 - 可选校验:调用
NtQuerySystemInformation枚举当前运行进程的文件句柄,检查该目录是否被后台运行的云同步类进程持有写入权限 - 满足以上任意两个条件即可判定为云同步目录
之前方案失效原因说明
你调用GetDriveTypeW、查询FILE_REMOTE_PROTOCOL_INFO无结果是正常的:现在主流云同步客户端默认采用本地文件系统挂载同步目录,不会挂载为远程网络驱动器,所以这两个接口无法识别到云同步相关标识。
内容的提问来源于stack exchange,提问作者Lucas Filleul
相关产品推荐
相关产品推荐

