How to list all children in Google Drive's appfolder and read file contents with Xamarin / c#?

ε祈祈猫儿з 提交于 2019-12-11 04:37:56

问题


I'm trying to work with text files in the apps folder.

Here's my GoogleApiClient constructor:

googleApiClient = new GoogleApiClient.Builder(this)
   .AddApi(DriveClass.API)
   .AddScope(DriveClass.ScopeFile)
   .AddScope(DriveClass.ScopeAppfolder)
   .UseDefaultAccount()
   .AddConnectionCallbacks(this)
   .EnableAutoManage(this, this)
   .Build();

I'm connecting with:

googleApiClient.Connect()

And after:

OnConnected()

I need to list all files inside the app folder. Here's what I got so far:

    IDriveFolder appFolder = DriveClass.DriveApi.GetAppFolder(googleApiClient);
    IDriveApiMetadataBufferResult result = await appFolder.ListChildrenAsync(googleApiClient);

Which is giving me the files metadata.

But after that, I don't know how to read them, edit them or save new files. They are text files created with my app's previous version (native).

I'm following the google docs for drive but the Xamarin API is a lot different and has no docs or examples. Here's the API I'm using: https://components.xamarin.com/view/googleplayservices-drive

Edit: Here is an example to read file contents from the guide:

    DriveFile file = ...
    file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null)
        .setResultCallback(contentsOpenedCallback);

First I can't find anywhere in the guide what "DriveFile file = ..." means. How do I get this instance? DriveFile seems to be a static class in this API. I tried:

IDriveFile file = DriveClass.DriveApi.GetFile(googleApiClient, metadata.DriveId);

This has two problems, first it complains that GetFile is deprecated but doesn't say how to do it properly. Second, the file doesn't have an "open" method.

Any help is appreciated.


回答1:


The Xamarin binding library wraps the Java Drive library (https://developers.google.com/drive/), so all the guides/examples for the Android-based Drive API work if you keep in mind the Binding's Java to C# transformations:

  • get/set methods -> properties
  • fields -> properties
  • listeners -> events
  • static nested class -> nested class
  • inner class -> nested class with an instance constructor

So you can list the AppFolder's directory and files by recursively using the Metadata when the drive item is a folder.

Get Directory/File Tree Example:

await Task.Run(() =>
{
    async void GetFolderMetaData(IDriveFolder folder, int depth)
    {
        var folderMetaData = await folder.ListChildrenAsync(_googleApiClient);
        foreach (var driveItem in folderMetaData.MetadataBuffer)
        {
            Log.Debug(TAG, $"{(driveItem.IsFolder ? "(D)" : "(F)")}:{"".PadLeft(depth, '.')}{driveItem.Title}");
            if (driveItem.IsFolder)
                GetFolderMetaData(driveItem.DriveId.AsDriveFolder(), depth + 1);
        }
    }
    GetFolderMetaData(DriveClass.DriveApi.GetAppFolder(_googleApiClient), 0);
});

Output:

[SushiHangover.FlightAvionics] (D):AppDataFolder
[SushiHangover.FlightAvionics] (F):.FlightInstrumentationData1.json
[SushiHangover.FlightAvionics] (F):.FlightInstrumentationData2.json
[SushiHangover.FlightAvionics] (F):.FlightInstrumentationData3.json
[SushiHangover.FlightAvionics] (F):AppConfiguration.json

Write a (Text) File Example:

using (var contentResults = await DriveClass.DriveApi.NewDriveContentsAsync(_googleApiClient))
using (var writer = new OutputStreamWriter(contentResults.DriveContents.OutputStream))
using (var changeSet = new MetadataChangeSet.Builder()
       .SetTitle("AppConfiguration.txt")
       .SetMimeType("text/plain")
       .Build())
{
    writer.Write("StackOverflow Rocks\n");
    writer.Write("StackOverflow Rocks\n");
    writer.Close();
    await DriveClass.DriveApi.GetAppFolder(_googleApiClient).CreateFileAsync(_googleApiClient, changeSet, contentResults.DriveContents);
}

Note: Substitute a IDriveFolder for DriveClass.DriveApi.GetAppFolder to save a file in a subfolder of the AppFolder.

Read a (text) File Example:

Note: driveItem in the following example is an existing text/plain-based MetaData object that is found by recursing through the Drive contents (see Get Directory/File list above) or via creating a query (Query.Builder) and executing it via DriveClass.DriveApi.QueryAsync.

var fileContexts = new StringBuilder();
using (var results = await driveItem.DriveId.AsDriveFile().OpenAsync(_googleApiClient, DriveFile.ModeReadOnly, null))
using (var inputStream = results.DriveContents.InputStream)
using (var streamReader = new StreamReader(inputStream))
{
    while (streamReader.Peek() >= 0)
        fileContexts.Append(await streamReader.ReadLineAsync());
}
Log.Debug(TAG, fileContexts.ToString());


来源:https://stackoverflow.com/questions/45561179/how-to-list-all-children-in-google-drives-appfolder-and-read-file-contents-with

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!