4

我知道这篇文章已经提到了这一点,但我希望对此有更多的澄清。

目前,使用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 方面),它看起来就像是一个严格的删除和一个新文件的进来。

如果您将这些文件中的数据存储在其他地方(如数据库中)并且您需要更新记录而不是创建新记录并删除旧记录,这可能会出现问题。

重命名后是否有一些公认的方法来跟踪文件关联?我似乎找不到使用元数据、增量或修订的方法。

4

4 回答 4

3

我认为 Dropbox 不知道重命名和删除/添加文件之间的区别。每次我重命名硬盘驱动器上本地 Dropbox 文件夹中的文件时,我都会立即看到旧文件重新出现,并带有“已删除”图标覆盖,而新文件显示“正在上传”图标。

通过比较已删除和创建的文件的内容(也许还比较时间戳),您可能能够以合理的准确度检测重命名,但即便如此它也是不确定的。

于 2013-04-11T14:21:28.000 回答
0

不幸的是,通过 Dropbox API 跟踪文件重命名的唯一方法是存储您需要跟踪的每个文件的内容哈希。

这是我检测重命名的方法:

  1. 打电话/delta,直到 Dropbox 告诉我退出。

  2. 现在我有了一个完整的更改列表,将这个文件列表过滤为:

    • 更新文件
    • 删除的文件
    • 新文件
  3. 读取每个新文件的内容并对其内容进行哈希处理。

  4. 对于每个已删除的文件,查找您存储的哈希,然后将其与每个新文件的哈希进行检查。如果两个哈希匹配,则文件已被重命名。

NB 只有当您可以在用户修改文件的那一刻更新文件的哈希时,此技术才有效。如果您的应用使用 Dropbox webhook 并且用户不编辑然后在离线时移动文件,则这是可能的。

我希望 Dropbox 最终会通过他们的 API 公开文件重命名。

于 2014-08-22T21:03:21.877 回答
0

您可以找到一个重命名的文件,因为 client_mtime 和 filesize 重命名不变。这是一种 hack,但比检查哈希更容易。

于 2014-10-29T15:53:38.120 回答
-1

在保管箱中,如果您有一个文件并且想要重命名它,那么只需按照此逻辑即可解决您的问题。

  1. 获取文件名称并更改它并将更改名称存储在字符串变量中。
  2. 保留原始文件的父路径。
  3. 使用从 String 变量获取的更改名称将文件移动到其他位置。
  4. 现在将文件从新地方移回旧地方,
                 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
于 2014-04-13T20:03:39.343 回答