检查文件夹是否存在,如果不存在则创建它

时间:2015-11-22 04:38:26

标签: android google-drive-api google-drive-android-api

我注意到在SO上没有确定的答案,所以我正在寻找对“如何检查文件夹是否存在的问题的规范性答案,如果不存在则创建它,使用Google Drive Android API?“。理想情况下显示使用ResultCallback的异步方法和使用.await()的同步方法的示例。

P.S。我知道this question with the same title,但接受的答案是关注isTrashed()上已知的滞后错误,并且不清楚您实际知道该文件夹存在的代码中的哪一点。其他答案似乎已经过时了。

2 个答案:

答案 0 :(得分:9)

This question - 同时关注滞后删除状态问题 - 确实提供了测试文件夹是否存在的模式。

使用异步回调:

Query query = new Query.Builder()
    .addFilter(Filters.and(Filters.eq(
            SearchableField.TITLE, "MyFolder"),
            Filters.eq(SearchableField.TRASHED, false)))
    .build();
    Drive.DriveApi.query(getGoogleApiClient(), query)
        .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
    @Override
    public void onResult(DriveApi.MetadataBufferResult result) {
        if (!result.getStatus().isSuccess()) {
            showMessage("Cannot create folder in the root.");
        } else {
            boolean isFound = false;
            for(Metadata m : result.getMetadataBuffer()) {
                if (m.getTitle().equals("MyFolder")) {
                    showMessage("Folder exists");
                    isFound = true;
                    break;
                }
            }
            if(!isFound) {
                showMessage("Folder not found; creating it.");
                MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                    .setTitle("MyFolder")
                    .build();
                Drive.DriveApi.getRootFolder(getGoogleApiClient())
                        .createFolder(getGoogleApiClient(), changeSet)
                        .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                    @Override
                    public void onResult(DriveFolder.DriveFolderResult result) {
                        if (!result.getStatus().isSuccess()) {
                            showMessage("Error while trying to create the folder");
                        } else {
                            showMessage("Created a folder");
                        }
                    }
                });
            }
        }
    }
});

使用同步.await()

Query query = new Query.Builder()
    .addFilter(Filters.and(Filters.eq(
            SearchableField.TITLE, "MyFolder"),
            Filters.eq(SearchableField.TRASHED, false)))
    .build();

    DriveApi.MetadataBufferResult result = Drive.DriveApi.query(getGoogleApiClient(), query)
        .await();

    if (!result.getStatus().isSuccess()) {
        showMessage("Cannot create folder in the root.");
    } else {
        boolean isFound = false;
        for(Metadata m : result.getMetadataBuffer()) {
            if (m.getTitle().equals("MyFolder")) {
                showMessage("Folder exists");
                isFound = true;
                break;
            }
        }
        if(!isFound) {
            showMessage("Folder not found; creating it.");
            MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                    .setTitle("MyFolder")
                    .build();

            Drive.DriveApi.getRootFolder(getGoogleApiClient())
                        .createFolder(googleApiClient, changeSet).await();

            if (!result.getStatus().isSuccess()) {
                showMessage("Error while trying to create the folder");
            } else {
                showMessage("Created a folder");
            }
        }

答案 1 :(得分:0)

你的引言:

  

...目前还不清楚您实际知道的代码中的哪一点   文件夹存在

REST Api中,您等待' ecexute()'方法的响应。直截了当,您可以将响应时间排除在外。你得到文件夹/文件ID(ResourceId),你知道它存在于驱动器中。

GDAA中,查看this answer。同样,当您使用有效的ResourceId获得完成通知时,您知道该文件夹/文件是“在那里”。

祝你好运