【问题标题】:Check if folder exists, and create it if not检查文件夹是否存在,如果不存在则创建它
【发布时间】:2015-11-22 04:38:26
【问题描述】:

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

附:我知道this question with the same title,但接受的答案集中在isTrashed() 上已知的滞后错误,并且不清楚您实际上知道该文件夹存在的代码中的哪个位置。其他答案似乎已过时。

【问题讨论】:

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


    【解决方案1】:

    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");
                }
            }
    

    【讨论】:

    • 如果文件夹中的文件已经退出,你能告诉我如何更新文件吗?
    • @Atula 抱歉,我已经 6 个月没有做过任何 Android 设备了,我真的不记得它是如何工作的 :(
    • 我正在使用您的异步代码,它之前运行良好,但现在有时会出现错误的文件夹存在,有什么解决办法吗?
    • @Panache 我不知道您所说的“提供虚假文件夹存在”是什么意思,您能解释一下吗?另外,我不太明白这是代码,因为我从喜欢的答案中复制了它,加上我做Android dev 已经快一年了,所以我可能无法回答。
    • @Panache 如果文件夹在垃圾箱中,则该文件夹存在
    【解决方案2】:

    您的报价:

    ... 不清楚您在代码中的哪一点真正知道 文件夹存在

    REST Api 中,您等待来自'ecexute()' 方法的响应。直截了当,您可以将响应超时。您获得文件夹/文件 ID (ResourceId),并且知道它存在于 Drive 中。

    GDAA 中,查看this answer。同样,当您收到带有有效 ResourceId 的完成通知时,您就知道该文件夹/文件在“up-there”。

    祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 2019-04-21
      • 2017-11-22
      • 2022-11-06
      • 2021-07-08
      • 2013-02-06
      • 2011-09-15
      • 1970-01-01
      相关资源
      最近更新 更多