2013-04-11 2 views
4

Я знаю, что это было затронуто в this post, но я надеялся на некоторое разъяснение об этом.API Dropbox, переименование и уникальные идентификаторы

В настоящее время с 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), это просто похоже на удаление пролива и появление нового файла.

Это может быть проблематично, если вы храните данные в этих файлах в другом месте (например, в базе данных), и вам нужно обновить запись вместо создания новой записи и удаления старой.

Есть ли принятый способ отслеживания ассоциации файлов после переименования? Кажется, я не могу найти способ сделать это, используя метаданные, дельта или ревизии.

ответ

3

Я не думаю, что Dropbox знает разницу между переименованием и удалением/добавлением файла. Каждый раз, когда я переименовываю файл в локальной папке Dropbox на моем жестком диске, я на мгновение вижу, что старый файл снова отображается с «удаленным» наложением значков, в то время как новый файл показывает значок «uploading».

Возможно, вы сможете обнаруживать переименования с разумной точностью, сравнивая содержимое файлов, которые были удалены и созданы (возможно, также сопоставлены временные метки), но даже тогда это некорректно.

+0

Да, в какой-то момент я пытался определить это, сохранив хэш содержимого файла, но он был серьезно взломан, поэтому я [отступил] (http://www.youtube.com/watch?v=2iE4uEsaBF0&feature= youtu.be & t = 10s) из этого решения. – wlvrn

+0

API имеет метод «move»: https://www.dropbox.com/developers/core/docs#fileops-move Сделайте с ним то, что вы будете =) – Rudie

-1

В Dropbox, если у вас есть файл, и вы хотите его переименовать, просто следуйте этой логике, он решит вашу проблему.

  1. Получить имя файла и изменить его и сохранить имя изменения в строковой переменной.
  2. Храните родительский путь в исходном файле.
  3. Переместить файл в другое место с изменением Name get from String variable.
  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 
+0

Чтобы переименовать файл, просто используйте Move API и укажите исходный путь и новый путь. Это похоже на переименование файла в Linux. –

+0

Два отрицательных избирателя пришли из окон, и они не знают, что такое переименование. !! это работало отлично для меня, так что голосование. –

0

К сожалению, единственным способом для отслеживания файла переименовывает через Dropbox API является для хранения содержимого хэша каждый файл, который вам нужно отслеживать.

Вот как я обнаруживаю переименовывает:

  1. Вызов /delta пока Dropbox не говорит мне, чтобы отступить.

  2. Теперь, когда у меня есть полный список изменений, отфильтровать этот список файлов в:

    • обновленных файлов
    • удаленные файлы
    • новые файлы
  3. Читать содержимое каждого нового файла и хеш его содержимого.

  4. Для каждого удалённого файла найдите хеш, который вы сохранили, затем проверьте это на хэш каждого нового файла. Если два хэша совпадают, то файл был переименован.

N.B. Этот метод работает только в том случае, если вы можете обновить хэш файла в момент его модификации пользователем. Это возможно, если ваше приложение использует Dropbox webhooks, и пользователь не редактирует , а затем перемещает файлы во время автономной работы.

Я надеюсь, что Dropbox в конечном итоге выдает переименование файлов через их API.

0

Вы можете найти переименованный файл, так как client_mtime и filesize переименовываются без изменений. Это своего рода взлом, но проще, чем проверка хэшей.

Смежные вопросы