寻求Windows资源管理器与Google Drive的唯一文件标识符(类UUID)
解决Windows资源管理器中Google Drive同步文件的唯一标识问题
我之前通过文件的
Id属性可以顺利更新Google Drive文件夹中文件的name属性,但现在需要执行一项依赖文件名的操作时,发现Windows资源管理器中的本地文件名无法完全对应云端真实文件名——Windows有Drive没有的命名限制,且Drive允许文件重名,唯一可靠的标识是不可变的Id属性。直接用本地文件名定位云端文件会出错,因此需要找到Windows资源管理器与Google Drive共有的类UUID属性来唯一标识文件。
可用的唯一标识属性:Google Drive ID
当你使用Google Drive桌面客户端同步文件时,每个本地同步的文件/文件夹都会在Windows系统属性中存储一个**"Google Drive ID"**属性,这个值完全对应云端Google Drive文件的Id字段,唯一且不可变,完美解决文件名不匹配的问题。
在Windows中查看该属性
打开同步文件的属性窗口 → 切换到「详细信息」标签 → 下拉找到「Google Drive ID」项,即可看到对应的云端文件ID。
C#中读取该属性的示例代码
通过Windows Shell API可以读取这个属性,实现逻辑如下:
using Shell32; using System.IO; public string GetGoogleDriveId(string filePath) { Shell shell = new Shell(); Folder folder = shell.NameSpace(Path.GetDirectoryName(filePath)); FolderItem item = folder.ParseName(Path.GetFileName(filePath)); // 遍历属性索引,找到"Google Drive ID"对应的项 int googleDriveIdIndex = -1; for (int i = 0; i < 300; i++) { string propName = folder.GetDetailsOf(null, i); if (propName == "Google Drive ID") { googleDriveIdIndex = i; break; } } return googleDriveIdIndex != -1 ? folder.GetDetailsOf(item, googleDriveIdIndex) : null; }
结合现有代码修改优化
获取到本地文件的Google Drive ID后,无需再通过文件名查询云端文件,直接用ID调用Drive API即可,避免文件名不匹配的问题:
public async Task CambioNombreFicheroSeleccionados(DriveService ds, List<string> localFilePaths) { try { foreach (var filePath in localFilePaths) { string driveFileId = GetGoogleDriveId(filePath); if (string.IsNullOrEmpty(driveFileId)) continue; var fileMetadata = new Google.Apis.Drive.v3.Data.File() { Name = Cg.ReemplazarCaracteresEspeciales(Path.GetFileName(filePath)) }; var request2 = ds.Files.Update(fileMetadata, driveFileId); await request2.ExecuteAsync(); } } catch (Exception ex) { string ss = ex.Message; } }
注意事项
- 确保Google Drive桌面客户端处于正常同步状态,该属性仅在已完成同步的文件上存在。
- 无论是"镜像文件"还是"流式传输"模式,该属性均有效,流式文件会在本地保留必要的元数据。
内容的提问来源于stack exchange,提问作者Manuel Cera Vera
相关产品推荐
相关产品推荐

