如何列出 Google Drive 的 appfolder 中的所有子项并使用 Xamarin / c# 读取文件内容?

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

我正在尝试使用应用程序文件夹中的文本文件。

这是我的 GoogleApiClient 构造函数:

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

我正在连接:

googleApiClient.Connect()

之后:

OnConnected()

我需要列出应用程序文件夹中的所有文件。这是我到目前为止得到的:

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

哪个给我文件元数据。

但在那之后,我不知道如何阅读、编辑或保存新文件。它们是使用我的应用程序的先前版本(本机)创建的文本文件。

我正在关注驱动器的 google 文档,但 Xamarin API 有很大不同并且没有文档或示例。这是我正在使用的 API:https://components.xamarin.com/view/googleplayservices-drive

编辑: 以下是从指南中读取文件内容的示例:

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

首先,我无法在指南中的任何地方找到 "DriveFile file = ..." 的含义。我如何获得这个实例? DriveFile 在这个 API 中似乎是静态的 class。 我试过了:

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

这有两个问题,首先它抱怨 GetFile 已被弃用,但没有说明如何正确执行。其次,该文件没有 "open" 方法。

感谢任何帮助。

Xamarin 绑定库封装了 Java Drive 库 (https://developers.google.com/drive/),因此基于 Android 的 Drive API 的所有 guides/examples 都可以工作如果您记住绑定的 Java 到 C# 转换:

  • get/set 方法 -> 属性
  • 字段 -> 属性
  • 听众 -> 事件
  • 静态嵌套 class -> 嵌套 class
  • 内部 class -> 嵌套 class 与实例构造函数

因此,当驱动器项是文件夹时,您可以通过递归地使用Metadata 列出AppFolder 的目录和文件。

获取 Directory/File 树示例:

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

输出:

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

写一个(文本)文件示例:

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("Whosebug Rocks\n");
    writer.Write("Whosebug Rocks\n");
    writer.Close();
    await DriveClass.DriveApi.GetAppFolder(_googleApiClient).CreateFileAsync(_googleApiClient, changeSet, contentResults.DriveContents);
}

注意:将 DriveClass.DriveApi.GetAppFolder 替换为 IDriveFolder 以将文件保存在 AppFolder 的子文件夹中。

读取(文本)文件示例:

注意:以下示例中的 driveItem 是一个现有的基于 text/plain 的元数据对象,它是通过递归驱动器内容(参见上面的获取 Directory/File 列表)或通过创建查询 (Query.Builder) 并通过 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());