2017-08-08 58 views
1

我正在嘗試使用應用程序文件夾中的文本文件。如何列出Google Drive的appfolder中的所有子項並使用Xamarin/c#讀取文件內容?

這裏是我的GoogleApiClient構造:

googleApiClient.Connect() 

而經過:

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

我與連接

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文件的任何地方找到= ...「的意思。我如何得到這個實例? DriveFile似乎是此API中的靜態類。 我想:

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

這有兩個問題,首先它抱怨的GetFile已被棄用,但並沒有說如何正確地做到這一點。其次,該文件沒有「打開」方法。

任何幫助表示讚賞。

回答

3

的Xamarin綁定庫包裝了Java的驅動器庫(https://developers.google.com/drive/),所以所有的指南/爲基於Android的驅動API工作的例子,如果你牢記綁定的Java到C#轉換:

  • GET /設定方法 - >屬性
  • 字段 - >屬性
  • 聽衆 - >事件
  • 靜態嵌套類 - >嵌套類
  • 內部類 - >嵌套類機智h的實例構造

因此,你可以通過遞歸使用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 Rocks\n"); 
    writer.Write("StackOverflow Rocks\n"); 
    writer.Close(); 
    await DriveClass.DriveApi.GetAppFolder(_googleApiClient).CreateFileAsync(_googleApiClient, changeSet, contentResults.DriveContents); 
} 

注:替換一個IDriveFolderDriveClass.DriveApi.GetAppFolder到將文件保存在AppFolder的子文件夾中。

閱讀(文本)文件示例:

注:driveItem在下面的例子中是受通過Drive內容遞歸(見獲取目錄/文件上述列表)或找到現有text/plain基於元數據對象通過創建查詢(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()); 
+0

謝謝。我正在與Android的Xamarin合作,我以前的版本是原生的,所以我遵循Java指南。我得到了這個。我設法得到了文件元數據,但這是我得到的。該API不起作用。我將用一個例子來編輯這個問題。 – Dpedrinha

+0

謝謝!我正在尋找這個driveItem。我猜API的主要問題是快速幫助信息是錯誤的。我習慣於輸入每個變量,我避免使用「var」,這就是爲什麼我永遠無法編譯。描述返回類型從來就不是正確的。給我一些時間來嘗試一下。再次感謝。 – Dpedrinha

+0

很好,謝謝!但如果你不介意的話,我還有一個問題。 API描述說,即使沒有連接,我也可以保存我的文件,一旦連接就會更新它們。但是,如果斷開連接,我無法對_googleApiClient執行任何操作。怎麼樣? – Dpedrinha

相關問題