通过传递文件夹名称检查Google API v3中是否存在文件夹

4
我正在使用Google API v3来检查文件夹是否存在。如果该文件夹不存在,则创建新文件夹。这是我的创建文件夹的代码:
 private void createFolderInDrive() throws IOException {
        boolean existed = checkExistedFolder("MyFolder");

        if (existed = false) {
            File fileMetadata = new File();
            fileMetadata.setName("MyFolder");
            fileMetadata.setMimeType("application/vnd.google-apps.folder");

            File file = mService.files().create(fileMetadata)
                    .setFields("id")
                    .execute();
            System.out.println("Folder ID: " + file.getId());

            Log.e(this.toString(), "Folder Created with ID:" + file.getId());



       Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getApplicationContext(),
                    "Folder is existed already", Toast.LENGTH_SHORT).show();
        }


    }

以下是检查文件是否存在的代码:

private boolean checkExistedFolder(String folderName) {
        //File file = null;
        boolean existedFolder = true;
        // check if the folder exists already
        try {
            //String query = "mimeType='application/vnd.google-apps.folder' and trashed=false and title='" + "Evacuation Kit" + "'";
            String query = "mimeType='application/vnd.google-apps.folder' and trashed=false and name='Evacuation Kit'";
            // add parent param to the query if needed
            //if (parentId != null) {
            //query = query + " and '" + parentId + "' in parents";
            // }

            Drive.Files.List request = mService.files().list().setQ(query);
            FileList fileList = request.execute();

            if (fileList.getFiles().size() == 0 ) {
                // file = fileList.getFiles().get(0);
                existedFolder = false;

            }


        } catch (IOException e) {
            e.printStackTrace();

        }
        return existedFolder;

fileList.getFiles().size() 一直返回3,即使G盘上没有文件夹。请问我的问题出在哪里?

3个回答

1
在您展示的代码中,checkExistedFolder 总是在寻找名称为“Evacuation Kit”的文件夹,而不使用参数 folderName。也许这就是你总是从 fileList.getFiles().size() 得到3的主要原因。

此外,在 if (existed = false) 中有一个赋值操作,应该使用 if ( false == existed ) -在比较中使用静态值可以避免这样的错误-,或者使用 if (!existed)。请注意,在调用 Files:list 时检查 nextPageToken 是否有更多页面来查找文件非常重要。请参见 https://developers.google.com/drive/api/v3/reference/files/listCreate folder if it does not exist in the Google Drive


0

这段代码将检测驱动器上的文件夹是否存在。如果存在,它将返回id,否则创建文件夹并返回id。

private DriveFile file;

GoogleApiClient mGoogleApiClient;

@Override
public void onConnected(@Nullable Bundle bundle) {
    Log.e(TAG, "connected");
    new Thread(new Runnable() {
        @Override
        public void run() {
            DriveId Id = getFolder(Drive.DriveApi.getRootFolder(mGoogleApiClient).getDriveId(), "FOLDER_NAME");
            Log.e(TAG, "run: " + Id);
        }
    }).start();
}

DriveId getFolder(DriveId parentId, String titl) {
    DriveId dId = null;
    if (parentId != null && titl != null) try {
        ArrayList<Filter> fltrs = new ArrayList<>();
        fltrs.add(Filters.in(SearchableField.PARENTS, parentId));
        fltrs.add(Filters.eq(SearchableField.TITLE, titl));
        fltrs.add(Filters.eq(SearchableField.MIME_TYPE, DriveFolder.MIME_TYPE));
        Query qry = new Query.Builder().addFilter(Filters.and(fltrs)).build();

        MetadataBuffer mdb = null;
        DriveApi.MetadataBufferResult rslt = Drive.DriveApi.query(mGoogleApiClient, qry).await();
        if (rslt.getStatus().isSuccess()) try {
            mdb = rslt.getMetadataBuffer();
            if (mdb.getCount() > 0)
                dId = mdb.get(0).getDriveId();
        } catch (Exception ignore) {
        } finally {
            if (mdb != null) mdb.close();
        }

        if (dId == null) {
            MetadataChangeSet meta = new MetadataChangeSet.Builder().setTitle(titl).setMimeType(DriveFolder.MIME_TYPE).build();
            DriveFolder.DriveFolderResult r1 = parentId.asDriveFolder().createFolder(mGoogleApiClient, meta).await();
            DriveFolder dFld = (r1 != null) && r1.getStatus().isSuccess() ? r1.getDriveFolder() : null;
            if (dFld != null) {
                DriveResource.MetadataResult r2 = dFld.getMetadata(mGoogleApiClient).await();
                if ((r2 != null) && r2.getStatus().isSuccess()) {
                    dId = r2.getMetadata().getDriveId();
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return dId;
}

过时的API,请参见https://dev59.com/M6jja4cB1Zd3GeqP8k3Y#63922175。 - Serg Burlaka

0

这是我在 Kotlin 上使用更新的 API时运行的代码:

 override fun createFolder(name: String): Task<GoogleDriveFileHolder> {

        check(googleDriveService != null) { "You have to init Google Drive Service first!" }
        check(search(name, FOLDER_MIME_TYPE).not()){"folder already exist"}

        return Tasks.call<GoogleDriveFileHolder>(
            mExecutor,
            Callable<GoogleDriveFileHolder> {

                val metadata = File()
                    .setMimeType(FOLDER_MIME_TYPE)
                    .setName(name)

                GoogleDriveFileHolder(
                    googleDriveService!!.files()
                        .create(metadata)
                        .setFields("id")
                        .execute() ?: throw IOException("Null result when requesting file creation.")
                )
            })
    }

    private fun search(name: String, mimeType:String): Boolean {

        var pageToken: String? = null

        do {

            val result: FileList =
                googleDriveService!!
                    .files()
                    .list()
                    .setQ("mimeType='$FOLDER_MIME_TYPE'")
                    .setSpaces("drive")
                    .setFields("nextPageToken, files(id, name)")
                    .setPageToken(pageToken)
                    .execute()

            for (file in result.files) {
                Log.d(TAG_UPLOAD_FILE , "Found file: %s (%s)\n ${file.name}, ${file.id} ")
                if (name == file.name) return true
            }

            pageToken = result.nextPageToken

        } while (pageToken != null)

        return false
    }

private const val FOLDER_MIME_TYPE= "application/vnd.google-apps.folder"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接