我知道this post已经触及了这一点,但我希望对此有一些额外的澄清。
目前,使用Dropbox Core API,似乎没有办法跟踪已重命名的文件。例如,如果您使用API将Dropbox app_folder与本地应用程序目录同步。您在Dropbox端重命名该文件,然后调用delta
以查看如何更新本地应用程序目录,您将返回两个条目......
array(
0 => '/somefile.txt',
1 => null
),
array(
0 => '/somefile-renamed.txt',
1 => array(
'revision' => 343
'rev' => 'd90se4c661'
'thumb_exists' => false
'bytes' => 1263
'modified' => 'Tue, 09 Apr 2013 19:06:39 +0000'
'client_mtime' => 'Tue, 09 Apr 2013 18:43:06 +0000'
'path' => string '/somefile-renamed.txt'
'is_dir' => false
'icon' => 'page_white_text'
'root' => 'app_folder'
'mime_type' => 'application/octet-stream'
'size' => '1.2 KB'
)
)
对于返回的每个数组,第一个元素是需要更新的文件,第二个元素是文件元数据信息。如果第二个元素是null
,则应该删除该文件的本地版本(以及它下面的任何内容,如果它是一个目录)。
因此,在上面的示例中,它告诉您删除第一个文件并上传这个全新的文件。不幸的是,没有办法跟踪你被告知要创建的这个新文件实际上只是你被告知要删除的文件的重命名版本。从您的应用程序的角度来看(非Dropbox方面),它看起来像是一个海峡删除和一个新文件。
如果您将这些文件中的数据存储在其他地方(例如数据库中)并且您需要更新记录而不是创建新记录并删除旧记录,则可能会出现问题。
重命名后是否有一些可接受的跟踪文件关联的方法?我似乎找不到使用元数据,delta或修订版的方法。
答案 0 :(得分:3)
我不认为Dropbox知道重命名和删除/添加文件之间的区别。每次我在硬盘驱动器上的本地Dropbox文件夹中重命名文件时,我都会立即看到旧文件重新显示为"已删除"图标叠加,而新文件显示"上传"图标。
您可以通过比较已删除和创建的文件的内容(也许还可以比较时间戳),以合理的准确度检测重命名,但即便如此,也是如此。
答案 1 :(得分:0)
不幸的是,通过Dropbox API跟踪文件重命名的唯一方法是存储您需要跟踪的每个文件的内容哈希。
以下是我检测重命名的方法:
致电/delta
,直到Dropbox告诉我退出。
现在我已经有了完整的更改列表,请将此文件列表过滤到:
读取每个新文件的内容并散列其内容。
对于每个已删除的文件,查找您已存储的哈希值,然后根据每个新文件的哈希值进行检查。如果两个哈希值匹配,则表示文件已重命名。
N.B。此技术仅在您可以在用户修改文件的哈希值时更新文件的哈希值时才有效。如果您的应用使用Dropbox webhooks并且用户在离线状态下无法编辑然后移动文件,则可以执行此操作。
我希望Dropbox最终通过他们的API公开文件重命名。
答案 2 :(得分:0)
您可以找到重命名的文件,因为client_mtime和filesize重命名未更改。这是一种黑客攻击,但比检查哈希更容易。
答案 3 :(得分:-1)
如果您有一个文件并且想要重命名它,请在Dropbox中,只需按照此逻辑即可解决您的问题。
How to do it Programatically,
Entry global_file;//assign any file to it
String FilePath=global_file.path;
String parent_path=global_file.parentPath();//Keep parent path
String ChanageName= "Your changed Name";
parent_path=parent_path+""+ChanageName; //setting path for renamed file to move to its original place.
Entry RenamedFile = mApi.move(FilePath, "/"+ChanageName); //move to new place "/"
Entry MoveRenameFile = mApi.move(RenamedFile.path,parent_path); //move to previous location