2017-01-30 5 views
0

私はDropbox APIと戦ってきました。私は少しのステップを踏んでいます(私はC#の新機能です)。問題は、私が最終的にDropboxアカウントのファイルに到達したことですが、StreamWriterを使用してローカルマシンに作成する方法がわかりません。C#でStreamWriterを使用してDropboxファイルを(APIを介して)書き込む方法は?

注:私はのawaitの事を知っているというように容易に向上させることができたが、私はまだそれに取得しています:「D

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Dropbox.Api; 

namespace Try1Dropbox 
{ 
    class Program 
    { 
     private const string ApiKey = "$$longChickenToken%%!!xD"; 

     static void Main(string[] args) 
     { 
      try 
      { 
       var task = Task.Run(async() => await Program.Run()); 
       task.Wait(); 
      } 
      catch (AggregateException ex) 
      { 
       var inner = ex.InnerException; 
       Console.WriteLine(inner.Message); 
       Console.ReadKey(); 
      } 
     } 

     static async Task Run() 
     { 
      using (var dbx = new DropboxClient(ApiKey)) 
      { 
       var full = await dbx.Users.GetCurrentAccountAsync(); 
       await ListRootFolder(dbx); 
       Console.WriteLine("{0} - {1}", full.Name.DisplayName, full.Email); 
       Console.ReadKey(); 
       await Download(dbx, @"/", "remotefile.pdf"); 
      } 
     } 

     private static async Task ListRootFolder(DropboxClient dbx) 
     { 
      var list = await dbx.Files.ListFolderAsync(string.Empty); 

      // Show folders, then files 
      foreach (var item in list.Entries.Where(i => i.IsFolder)) 
      { 
       Console.WriteLine("D {0}/", item.Name); 
      } 
      foreach (var item in list.Entries.Where(i => i.IsFile)) 
      { 
       Console.WriteLine("F{0,8} {1}", item.AsFile.Size, item.Name); 
      } 
     } 

     private static async Task Download(DropboxClient dbx, string folder, string file) 
     { 
      string path = System.IO.Path.Combine(folder, file); 
      var args = new Dropbox.Api.Files.DownloadArg(path); 
      using (var response = await dbx.Files.DownloadAsync(args)) 
      { 
       using (var sw = new System.IO.StreamWriter(@"c:\prueba\localtest.pdf")) 
       { 
        Console.WriteLine(await response.GetContentAsStringAsync()); 
        sw.Write(response.GetContentAsByteArrayAsync()); 

        Console.ReadKey(); 
       } 
      } 
     } 
    } 
} 

ポイントは、私は「しようsw.Write、に行きます私がコンソールに受け取ったレスポンスを "挿入"しますが、代わりにこの "System.Threading.Tasks.Task`1 [System.Byte []]"を取得します。

事前に感謝し、n00banceをお詫び申し上げます。 C#とDropbox APIの新機能

+0

WriteLineは返されたTaskオブジェクトのString表現を出力しています。 'var response = await response ...'を呼び出して分割し、印刷したいプロパティを何でも印刷します。 – Fildor

答えて

2

に関する詳細な情報を見つけることができます

var taskResult = await response.GetContentAsStringAsync(); 

Console.WriteLine(taskResult.Result); 

: 何が書きたいことは、実際の結果である

sw.Write(response.GetContentAsByteArrayAsync()); 

とにかく、メソッドのシグネチャは、

Task<byte[]> GetContentAsByteArrayAsync() 

したがって、Task<byte[]>sw.Write(...)StreamWriter.Writeのデフォルトの動作 - オブジェクトが渡された場合 - は多くのクラスの型名であるwrite the text representation of an objectになります。これはあなたが見たものです。さらに、非同期操作awaitを忘れてしまったので、Task<byte[]>があります。実際にbyte[]を取得し、Task<byte[]>を取得するには、電話をawaitにする必要があります。 GetContentAsStringAsyncへの呼び出しを参照してください。

あなたがここにbyteの配列を書きたいと思いますので、あなたがStreamWriterは必要ありませんが、上で動作することができが(うまくない正確に、しかしStreamWriterよりも生)ストリーム。

using (var stream = File.OpenWrite(@"c:\prueba\localtest.pdf")) 
{ 
    Console.WriteLine(await response.GetContentAsStringAsync()); 

    var dataToWrite = await response.GetContentAsByteArrayAsync(); 
    stream.Write(dataToWrite, 0, dataToWrite.Length); 

    Console.ReadKey(); 
} 
0

Dropbox APIドキュメントを見ると、GetContentAsStringAsync()メソッドがasyncの場合、Task<string>が返されます。 Console.Writelineは単にTask<string>.ToString()を呼び出し、表示されるのはToString()メソッドのデフォルトの実装です。あなたは次のように書かれているMSDN

0

さて、私はついに解決策を見つけました!

private static async Task Download(DropboxClient dbx, string folder, string file) 
{ 
    string path = Path.Combine(folder, file); 
    var args = new Dropbox.Api.Files.DownloadArg(path); 
    using (var response = await dbx.Files.DownloadAsync(args)) 
    { 
     using (var sw = new StreamWriter(@"c:\prueba\localfile.pdf")) 
     { 
      Console.WriteLine(await response.GetContentAsStringAsync()); 
      var bytes = await response.GetContentAsByteArrayAsync(); 
      await sw.BaseStream.WriteAsync(bytes, 0, bytes.Length); 
      Console.ReadKey(); 
     } 
    } 
} 

いいえ、ToStringの魔法はすべて魔法のXDでした。ありがとうございました!

+1

私の答えを見てください:あなたは 'await'を忘れて、'仕事 'を' sw.Write(...) 'に渡しました。 'ToString'は全く変わっていません。 –

+0

それは奇妙ではありません。 'Console.Writeline'は'(Task ).ToString() 'を呼び出すだけで、あなたが見るのは' ToString() 'メソッドのデフォルト実装です。 – peval27

+0

@PaulKertscherありがとうございました!便利です!私はスイスアーミーナイフを持っていて、ビッグキーの使い方を "知っている"ような気がします... – Gonzo345

関連する問題