【问题标题】:Java - Download and delete file on Google DriveJava - 下载和删除 Google Drive 上的文件
【发布时间】:2018-04-07 16:11:50
【问题描述】:

我有一个 Android 应用程序,有时需要在 Google Drive 上创建和删除一些文本文件,并下载/获取这些文件的内容以在活动中显示它。 因此,一段时间以来,我一直在尝试寻找一种仅使用文件名来执行此操作的方法,但是在查找有关如何操作的信息时似乎遇到了很多问题。此外,不是 Java 开发人员并不会让事情变得更容易。

我设法在根文件夹中创建了一个文件:

private void createFile()
{
    println("CreateFileActivity > createFile");

    final Task<DriveFolder> rootFolderTask = getDriveResourceClient().getRootFolder();
    final Task<DriveContents> createContentsTask = getDriveResourceClient().createContents();
    Tasks.whenAll(rootFolderTask, createContentsTask)
            .continueWithTask(task -> {
                DriveFolder parent = rootFolderTask.getResult();
                DriveContents contents = createContentsTask.getResult();
                OutputStream outputStream = contents.getOutputStream();

                try (Writer writer = new OutputStreamWriter(outputStream))
                {
                    writer.write("SOME_TEXT_HERE");
                }

                MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                                                      .setTitle("MyFile.txt")
                                                      .setMimeType("text/plain")
                                                      .setStarred(true)
                                                      .build();

                return getDriveResourceClient().createFile(parent, changeSet, contents);
            })
            .addOnSuccessListener(this,
                    driveFile -> {
                        System.out.println("File created");

                        Intent resultActvityIntent = new Intent(getApplicationContext(), ResultActivity.class);
                        startActivity(resultActvityIntent);
                    })
            .addOnFailureListener(this, e -> {
                Toast.makeText(this, "Unable to create file", Toast.LENGTH_SHORT).show();
                System.out.println("Unable to create file");
                Log.e(TAG, "Unable to create file", e);

                Intent resultActvityIntent = new Intent(getApplicationContext(), ResultActivity.class);
                startActivity(resultActvityIntent);
            });
}

但令我惊讶的是,它每次都会创建一个具有相同名称的新文件,而不是覆盖它。

此外,我似乎无法仅使用文件名删除文件或下载文件/分级内容。 我找到了很多关于如何使用文件 ID 删除文件的信息,还找到了 Google 提供的示例,但这并不是我真正需要的。

@Override
protected void onDriveClientReady() 
{
    pickTextFile()
            .addOnSuccessListener(this,
                    driveId -> deleteFile(driveId.asDriveFile()))
            .addOnFailureListener(this, e -> {
                Log.e(TAG, "No file selected", e);
                showMessage(getString(R.string.file_not_selected));
                finish();
            });
}
private void deleteFile(DriveFile file) 
{
    // [START delete_file]
    getDriveResourceClient()
            .delete(file)
            .addOnSuccessListener(this,
                    aVoid -> {
                        showMessage(getString(R.string.file_deleted));
                        finish();
                    })
            .addOnFailureListener(this, e -> {
                Log.e(TAG, "Unable to delete file", e);
                showMessage(getString(R.string.delete_failed));
                finish();
            });
    // [END delete_file]
}

关于如何做到这一点或从哪里开始寻找任何想法? 或者无法直接从应用内删除文件?

【问题讨论】:

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


    【解决方案1】:

    这就是 Google Drive API 的工作原理。一切都使用文件ID。您应该做的是发送 q 参数的 file.list 以搜索具有正确名称和文件类型的文件。然后,您将拥有文件 ID 以便能够更新文件。

    Google drive API 不会阻止您创建多个同名文件。

    【讨论】:

    • 谢谢。这真的很有帮助。
    【解决方案2】:

    根据@DalmTo 的建议,这是我删除 Google Drive 上文件的解决方案。下面的示例跳过垃圾并永久删除文件。

    private static final String fileName = "MyAppsTextFile.txt";
    
    private void deleteExistingFile()
    {
        println("DeleteFileActivity > deleteExistingFile");
    
        Query query = new Query.Builder()
                .addFilter(Filters.eq(SearchableField.TITLE, fileName))
                .build();
    
        Task<MetadataBuffer> queryTask = getDriveResourceClient().query(query);
    
        queryTask.addOnSuccessListener( this,
                new OnSuccessListener<MetadataBuffer>()
                {
                    @Override
                    public void onSuccess(MetadataBuffer metadataBuffer)
                    {
                        System.out.println("Success. File/s found!");
    
                        for(Metadata m : metadataBuffer)
                        {
                            DriveResource driveResource = m.getDriveId().asDriveResource();
    
                            System.out.println("Deleting file " + fileName + " with DriveID m.getDriveId()");
                            getDriveResourceClient().delete(driveResource);
                        }
                    }
                })
                .addOnFailureListener(this, new OnFailureListener()
                {
                    @Override
                    public void onFailure(@NonNull Exception e)
                    {
                        System.out.println("ERROR: File not found!");
                    }
                });
    }
    

    由于线程标题是下载和删除,下面是从 Google 驱动器获取文件内容的代码:

    private static final String fileName = "MyAppsTextFile.txt";
    
    private void getFiles()
    {
        System.out.println("GetGoogleDriveFile > getFiles");
    
        Query query = new Query.Builder()
                .addFilter(Filters.eq(SearchableField.TITLE, fileName))
                .build();
    
        Task<MetadataBuffer> queryTask = getDriveResourceClient().query(query);
    
        queryTask
                .addOnSuccessListener(this,
                        new OnSuccessListener<MetadataBuffer>()
                        {
                            @Override
                            public void onSuccess(MetadataBuffer metadataBuffer)
                            {
                                System.out.println("On SUCCESS");
    
                                for( Metadata m : metadataBuffer )
                                {
                                    DriveFile driveFile = m.getDriveId().asDriveFile();
                                    getFileContents(driveFile);
                                }
                            }
                        })
                .addOnFailureListener(this, new OnFailureListener()
                {
                    @Override
                    public void onFailure(@NonNull Exception e)
                    {
                        System.out.println("On FAILURE");
                    }
                });
    }
    
    private void getFileContents(DriveFile myFile)
    {
        System.out.println("GetGoogleDriveFile > getFileContents");
    
        Task<DriveContents> openFileTask =
                getDriveResourceClient().openFile(myFile, DriveFile.MODE_READ_ONLY);
    
        openFileTask
                .continueWithTask(new Continuation<DriveContents, Task<Void>>()
                {
                    @Override
                    public Task<Void> then(@NonNull Task<DriveContents> task) throws Exception
                    {
                        DriveContents contents = task.getResult();
    
                        try (BufferedReader reader = new BufferedReader(
                                new InputStreamReader(contents.getInputStream())))
                        {
                            StringBuilder builder = new StringBuilder();
                            String line;
    
                            while ((line = reader.readLine()) != null)
                            {
                                builder.append(line).append("\n");
                            }
    
                            userData = builder.toString();
                        }
    
                        System.out.println("We have the file content!");
    
                        Task<Void> discardTask = getDriveResourceClient().discardContents(contents);
                        return discardTask;
                    }
                })
                .addOnFailureListener(new OnFailureListener()
                {
                    @Override
                    public void onFailure(@NonNull Exception e)
                    {
                        System.out.println("Unable to read file!");
                    }
                });
    }
    

    我很确定这可以改进,但我想这对于任何寻求解决方案的人来说都是一个开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多