我开发了一个Java程序来搜索Google Drive上特定文件夹中的特定文件。它使用DFS(深度优先搜索)算法进行搜索。
然而,搜索效率非常差。如果文件位于“更晚”或更深的文件夹中,则程序将在几分钟内找到,如果找到,或者有时会超时并响应HTTP 500内部服务器错误。
该计划如下:
public static void main(String[] args) throws IOException {
DriveSearch driveSearch = new DriveSearch();
String searchResult = driveSearch.fetchData("F1b1ZuRUpPLWh6",
"test.txt");
System.out.println(searchResult);
}
public String fetchData(String folderID, String searchFileName) {
String result = "";
~~~~~ Skip Codes for Authorization ~~~~
// try {
// try {
Drive service = new Drive.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();
long startTime = System.currentTimeMillis(); // Begin search time
// String pageToken = null;
// do {
System.out.println("=== Begin Search ===");
File searchResult = recursiveSearch(folderID, searchFileName);
System.out.println("=== End Search ===");
long endTime = System.currentTimeMillis(); // End search time
long totTime = (endTime - startTime) / 1000;
System.out.println("This search takes " + totTime + " seconds to find the file.");
if (searchResult != null) {
result = searchResult.getName();
}
// pageToken = fileList.getNextPageToken();
// } while (pageToken != null);
// } catch (IOException e) {
// result = "invalid_grant";
// System.err.println(e.getMessage());
// }
// } catch (Throwable t) {
// t.printStackTrace();
// }
return result;
}
public File recursiveSearch(String folderID, String searchFileName) throws IOException {
File searchResult = null;
FileList fileList = service.files().list().setQ("'" + folderID + "' in parents and trashed = false")
// .setSpaces("drive")
.setCorpora("user").setFields("nextPageToken, files(id, name, mimeType)").execute();
List<File> items = fileList.getFiles();
for (File file : items) {
if (file.getName().equals(searchFileName)) {
searchResult = file;
System.out.println(file.getName() + " is found!");
return searchResult;
} else if (file.getMimeType().equals("application/vnd.google-apps.folder")) {
System.out.println("Recursive Search");
System.out.println("file.getId() is " + file.getId());
searchResult = recursiveSearch(file.getId(), searchFileName);
} else {
System.out.println("file name is " + file.getName());
}
}
return searchResult;
}
由于特定文件可以立即在Google云端硬盘搜索栏中找到,是否也可以立即在特定文件夹中找到?如果是,我该怎么做才能提高搜索效率?谢谢你的任何建议。
答案 0 :(得分:4)
昂贵的部分是在每次递归调用中调用Google云端硬盘。它们不是必需的。您可以在一次通话中获取所有文件的列表:
@Html.HiddenForCollection(m => m.MyList)
然后搜索文件的文件列表。当然,您可以像在代码中一样添加过滤器,例如:过滤掉已删除的文件。