2017-08-08 8 views
1

私はappsフォルダ内のテキストファイルを操作しようとしています。Googleドライブのappfolderにすべての子供をリストし、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() 

私はappフォルダ内のすべてのファイルを表示する必要があります。ここに私がこれまでに得たものがあります:

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

これは、2つの問題がある最初のそれはGETFILEが廃止されましたが、それを正しく行う方法を言っていないことに文句を言います。第2に、ファイルには「公開」メソッドがありません。

何か助けていただければ幸いです。あなたがC#の変換に心の中でのJavaバインディングを続ければ

答えて

3

Xamarin結合ライブラリーは、(https://developers.google.com/drive/)AndroidベースのドライブのAPI作業のため、すべてのガイド/例はJavaのドライブのライブラリをラップ:

  • GET /設定メソッド - >プロパティ
  • フィールド - >プロパティ
  • リスナー - >イベント
  • 静的ネストされたクラス - >ネストされたクラス
  • インナークラス - >ネストされたクラスウィットhインスタンスコンストラクタ

ドライブ項目がフォルダの場合、Metadataを使用して再帰的にAppFolderのディレクトリとファイルをリストすることができます。

ディレクトリ/ツリーのファイルの例です:

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

注:へDriveClass.DriveApi.GetAppFolderためIDriveFolderに置き換え(テキスト)ファイルの例書く

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

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

出力をAppFolderのサブフォルダにファイルを保存します。

ファイルの例を(テキスト)を読む:

注:次の例ではdriveItem(上記ゲットディレクトリ/ファイルリストを参照)、またはドライブの内容によって再帰によって発見された既存の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

関連する問題