我正在寻找一种方法来使用Dropbox API来恢复我的文件,谷歌将我带到了这里。
首先,关于我的情况:
我的电脑遇到了一个病毒,它重命名了我的所有文件(如果它被识别为在Dropbox上重命名或删除,则为idk)并且它们都被同步到Dropbox。我想使用Dropbox API下载所有原始文件。
正如我在网络界面上看到的那样,我可以单独下载它们,但我有一千个文件,所以我无法做到。
我的问题:
我使用Python API包装器来使用Dropbox API。我首先获取了所有文件,并尝试获取所有修订版本,但原始文件未包含在修订列表中。
然后我尝试列出我的所有文件,包括已删除的文件,我可以看到我列出的原始文件。我尝试使用下载端点下载它们,但它返回i. Item 1
ii. Item 2
iii. Item 3
错误。有没有人碰到类似的东西?我该如何解决这个问题?
我的代码段
File not found
答案 0 :(得分:2)
我今天下午一直在为这个确切的问题摸不着头脑,试图恢复被同一个勒索软件击中的朋友Dropbox的状态。我不知道你是否仍然需要一个解决方案,但简而言之,这就是游戏的状态。
在Dropbox API V2中,每个文件都有唯一的ID。这是删除,重命名,移动等的持久性。这将是解决此问题的关键,因为Dropbox按文件路径跟踪文件历史记录,因此只要勒索软件重命名您的文件,只需以编程方式回滚文件即可丢失。为了使事情变得更加困难,请将include_deleted
设置为True的目录列表获取,并且您会注意到Dropbox不会在元数据中包含用于删除的文件ID。如果他们这样做,这将是一件轻而易举的事。
所以,在这里做什么:
将该文件列表拆分为两个列表,即现有文件和已删除的文件:
deleted = list(filter(lambda file:isinstance(file,dropbox.files.DeletedMetadata),files.entries))
(其中files
是dropbox.files.ListFolderResult
)的实例
dropbox.Dropbox.files_list_revisions
获取修订列表。进行第一次修订,这将是最新版本,并将其ID与文件路径一起存储。这是我们获取已删除文件的ID的方式。我故意将代码中的实际实现留给您,但我希望这会有所帮助。
答案 1 :(得分:0)
感谢James Scholes,正是我所寻找的。 解决方案适用于文件,但这不适用于文件夹,因为文件夹没有版本/修订版。在这种情况下,我可以取消删除文件夹的任何其他方式??。
谢谢,
答案 2 :(得分:0)
Java中的示例代码:
public static void main(String[] args) throws IOException, DbxException {
String userLocale = Locale.getDefault().toString();
DbxRequestConfig requestConfig = new DbxRequestConfig("examples-authorize", userLocale);
DbxClientV2 client = new DbxClientV2(requestConfig, AUTH_TOKEN);
FullAccount account = client.users().getCurrentAccount();
Set<String> folderNames;
SearchResult result = client.files().searchBuilder("/Pankaj", "*.cerber3").withMaxResults(1000L).withMode(SearchMode.FILENAME).start();
folderNames = new HashSet<>(result.getMatches().size());
for (SearchMatch match : result.getMatches()){
FileMetadata fileMetadata = (FileMetadata) match.getMetadata();
String path = fileMetadata.getPathLower();
folderNames.add(path.substring(0, path.lastIndexOf("/")));
}
for(String path : folderNames){
processDirectory(path, client);
}
}
static void processDirectory(String dirName, DbxClientV2 client) throws DbxException {
ListFolderResult result = client.files().listFolderBuilder(dirName).withIncludeDeleted(true).start();
while (true) {
for (Metadata metadata : result.getEntries()) {
if(metadata instanceof DeletedMetadata){
String filePath = metadata.getPathLower();
if(filePath.endsWith(".doc") || filePath.endsWith(".docx") || filePath.endsWith(".pdf")){
List<FileMetadata> revisions = client.files().listRevisions(filePath).getEntries();
if(revisions.size()>0) {
FileMetadata revision = revisions.get(0);
System.out.println("Deleted File: " + filePath + ", " + revision.getClientModified() + ", Id:" + revision.getId());
revision.getRev();
client.files().restore(filePath, revision.getRev());
}
}
}
}
if (!result.getHasMore()) {
break;
}
result = client.files().listFolderContinue(result.getCursor());
}
}