通过传递文件夹名称

时间:2018-01-17 19:34:28

标签: java android google-api-v3

我正在使用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 个答案:

答案 0 :(得分:1)

在显示的代码中,checkExistedFolder始终在寻找名称“ Evacuation Kit”,而不使用参数folderName。也许这是您总是总是从fileList.getFiles().size()获得3的主要原因。

if (existed = false)中还有一个赋值,您应该使用if ( false == existed )-使用比较左侧的静态值有助于避免此类错误-或{{ 1}}。请注意,在调用Files:list时检查nextPageToken非常重要,以检查是否还有更多页面要查找该文件。在这里https://developers.google.com/drive/api/v3/reference/files/listCreate folder if it does not exist in the Google Drive

中查看更多

答案 1 :(得分:0)

此代码将检查驱动器上是否存在文件夹。如果存在,它将返回id else else create folder并返回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;
}

答案 2 :(得分:0)

updated API一起在Kotlin上为我工作的代码:

 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"