我尝试使用查询在Google云端硬盘应用文件夹中获取IDriveResource,但我在使用类型转换方面遇到了问题。 这是我到目前为止的代码:
using (IDriveFolder appFolder = DriveClass.DriveApi.GetAppFolder(googleApiClient))
using (QueryClass query = new QueryClass.Builder().AddFilter(Filters.Eq(SearchableField.Title, MY_FILE_NAME)).Build())
using (var queryResult = await appFolder.QueryChildrenAsync(googleApiClient, query))
using (var driveItem = queryResult.MetadataBuffer)
{
using (var driveFile = await driveItem.DriveId.AsDriveFile().OpenAsync(googleApiClient, DriveFile.ModeWriteOnly, null))
using (var outputStream = driveFile.DriveContents.OutputStream)
using (var writer = new OutputStreamWriter(outputStream))
using (var changeSet = new MetadataChangeSet.Builder()
.SetLastViewedByMeDate(new Java.Util.Date())
.Build())
{
writer.Write(MY_TEXT);
writer.Close();
driveFile.DriveContents.Commit(googleApiClient, changeSet);
}
}
但编译器无法识别 driveItem 中的 DriveId 属性。我需要输入强制转换 driveItem ,但编译器不会接受任何选项。如果它接受 driveItem 声明(如MetadataBuffer),则它不会拥有 DriveId 属性。如果我尝试IDriveFile或IDriveResource,它就不会接受变量声明中的强制转换。
我尝试将 driveItem 传递给类似的方法时遇到了同样的问题:
private async Task<bool> saveDriveItem(???? driveItemToSave)
{
...
}
我不能使用这种方法,因为我找不到合适的????要使用的类型。
有什么想法吗?
感谢。
答案 0 :(得分:1)
MetadataBuffer
是元数据条目的集合,您尝试将其用作单个MetaData
对象。
当您使用云端硬盘查询时,您可以取回多个文件/文件夹,因为云端硬盘允许您在同一文件夹中拥有多个同名文件。
查看查询中的所有结果:
using (IDriveFolder appFolder = DriveClass.DriveApi.GetAppFolder(googleApiClient))
using (QueryClass query = new QueryClass.Builder().AddFilter(Filters.Eq(SearchableField.Title, MY_FILE_NAME)).Build())
using (var queryResult = await appFolder.QueryChildrenAsync(googleApiClient, query))
{
foreach (var driveItem in queryResult.MetadataBuffer)
{
Log.Debug("SO", driveItem.Title);
}
}
由于您使用AppFolder
并且只有您的应用可以写入, suppmably 您只有一个文件具有该唯一文件名,除非您的代码未检查预先存在文件,只是写一个具有相同名称的新文件(允许)。
仅检查MetadataBuffer
中的一个结果,否则请记录错误消息:
using (IDriveFolder appFolder = DriveClass.DriveApi.GetAppFolder(googleApiClient))
using (QueryClass query = new QueryClass.Builder().AddFilter(Filters.Eq(SearchableField.Title, MY_FILE_NAME)).Build())
using (var queryResult = await appFolder.QueryChildrenAsync(googleApiClient, query))
{
if (queryResult.MetadataBuffer.Count == 1)
{
var driveItem = queryResult.MetadataBuffer.Get(0) as Metadata;
using (var driveFile = await driveItem.DriveId.AsDriveFile().OpenAsync(googleApiClient, DriveFile.ModeWriteOnly, null))
{
// do something with your drivefile...
}
}
else
{
Log.Error("SO", $"The query for {MY_FILE_NAME} returned {queryResult.MetadataBuffer.Count} results?!?!?");
// Your app is writing multiple files with the same name...
}
}