如何列出Google云端硬盘的应用程序文件夹中的所有孩子并使用Xamarin / c#读取文件内容?



我正在尝试处理apps文件夹中的文本文件。

这是我的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);

这给了我文件元数据。

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

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

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

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

首先,我在指南中的任何地方都找不到"驱动器文件文件 = ..."方法。如何获取此实例?DriveFile 似乎是此 API 中的一个静态类。 我试过了:

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

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

任何帮助,不胜感激。

Xamarin 绑定库包装了 Java Drive 库 (https://developers.google.com/drive/(,因此,如果您牢记绑定的 Java 到 C# 转换,则基于 Android 的 Drive API 的所有指南/示例都可以使用:

  • 获取/设置方法 ->属性
  • 字段 ->属性
  • 侦听器 ->事件
  • 静态嵌套类 ->嵌套类
  • 内部类 ->具有实例构造函数的嵌套类

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

获取目录/文件树示例:

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

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

读取(文本(文件示例:

注意:以下示例中的driveItem是基于text/plain的现有 MetaData 对象,该对象是通过递归驱动器内容(请参阅上面的获取目录/文件列表(或通过创建查询 (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());

最新更新