如何列出 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());
我正在尝试使用应用程序文件夹中的文本文件。
这是我的 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());