是否存在一种可靠的方法,除了比较完整内容外,还可以检查文件是否在云端硬盘中已更新/更改?
我一直为此苦苦挣扎。这是我尝试过的两件事:
1。归档version
号
我将纯文本文件上传到Google云端硬盘(simple upload,update endpoint),并在成功上传后返回的file metadata中保存version
。
然后我偶尔轮询Drive API(get endpoint),以检查版本是否已更改。
问题在于,在上传文件后的一两秒钟内,该版本再次遭到破坏。
文件内容没有更改。该文件尚未打开,查看或什至没有下载到其他任何地方。尽管如此,版本号仍比上传后的版本高。
对于我的代码,此版本号更改表示远程文件已在云端硬盘中更改,因此它将下载新版本。每次!
2。 Changes
个端点
我尝试使用Changes api。
上传文件后,我使用changes.getStartPageToken
或changes.list
得到了page token
。
稍后,我使用此page token
来轮询Changes API的更改,并过滤上载文件的fileId的更改。轮询更改时,我使用以下选项:
{
"includeRemoved": false
"restrictToMyDrive": true
"spaces": "drive"
}
再一次,存在与版本号相同的问题。上传文件后立即返回的页面令牌在一两秒钟内再次更改。新页面令牌显示上传的文件已更改。
同样,文件内容没有更改。它尚未在其他任何地方打开,更新或下载。未与其他任何人共享。
但是,上传几秒钟后,文件重新出现在更改列表中。
结果是,本地代码假设进行了远程更改,从云端硬盘重新下载了文件。
可能的解决方法
作为一个棘手的挂钩,我可以在文件上传后等待几秒钟,然后再获取新的文件版本/更改页面令牌。这可以解决延迟的版本增加问题。
但是,没有文档说明引起此幻像版本号更改的原因(或changes.list)。因此,我不确定是否知道:
是否存在一种可靠的方法,除了比较完整内容外,还可以检查文件是否在云端硬盘中已更新/更改?
答案 0 :(得分:1)
如果您的文件不是Google Doc文件(即二进制文件),则可以尝试使用File resource object的md5Checksum
属性。您应该可以使用它来跟踪二进制文件内容的更改。
您也许还可以使用Revisions API。
Revisions resource object还具有md5Checksum
属性。
答案 1 :(得分:1)
您看到的是Google云端硬盘文件系统的最终一致性功能。如果您考虑搜索,则搜索索引的更新速度没有多大关系,只是最终会更新索引并非常有效地进行读取。 Google云端硬盘在相同的前提下工作。
驱动器会尽快确认您的更新。这些更新传播到文件的所有全球副本之前很久。在更新“完成”之后也要计算派生数据(例如,时间戳,我想我记得是md5sums)。
解决方案在很大程度上取决于冗余同步对您的应用的问题。
答案 2 :(得分:1)
作为解决方法,如何使用Drive Activity API?我认为您的情况有几个答案。因此,请仅考虑其中之一。
使用Drive Activity API时,可以检索有关目标文件的活动信息。例如,从ActionDetail中,您可以查看目标文件是否已被编辑,重命名,删除等。
示例端点和请求正文如下。
POST https://driveactivity.googleapis.com/v2/activity:query?fields=activities%2CnextPageToken
{"itemName": "items/### fileId of target file ###"}
样品响应如下。您可以从中查看信息。带有fileId和filename的文件是在时间戳上编辑的。
{
"activities": [
{
"primaryActionDetail": {
"edit": {} <--- If the target file was edited, this property is added.
},
"actors": [
{
"user": {
"knownUser": {
"personName": "people/### userId who edited the target file ###",
"isCurrentUser": true
}
}
}
],
"actions": [
{
"detail": {
"edit": {}
}
}
],
"targets": [
{
"driveItem": {
"name": "items/### fileId of target file ###",
"title": "### filename of target file ###",
"file": {},
"mimeType": "### mimeType of target file ###",
"owner": {
"user": {
"knownUser": {
"personName": "people/### owner's userId ###",
"isCurrentUser": true
}
}
}
}
}
],
"timestamp": "2000-01-01T00:00:0.000Z"
},
],
"nextPageToken": "###"
}
https://www.googleapis.com/auth/drive.activity.readonly
包括在范围中。如果这不是您想要的,我表示歉意。