2017-01-30 36 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 []]「。

在此先感謝您,併爲此感到遺憾。 C#和Dropbox API新增功能

+0

WriteLine正在打印返回的Task對象的String表示形式。將該調用分解爲'var response = await response ...',然後打印您希望打印的任何屬性。 – Fildor

回答

2

你寫了下面的詳細信息:

sw.Write(response.GetContentAsByteArrayAsync()); 

總之,方法的簽名

Task<byte[]> GetContentAsByteArrayAsync() 

因此,你通過了一個Task<byte[]>sw.Write(...)StreamWriter.Write的默認行爲 - 對於傳遞的對象 - 是write the text representation of an object - 這是許多類的類型名稱 - 這是您所看到的。此外,你忘記了await異步操作,因此你有一個Task<byte[]>。您必須撥打await才能獲得實際的byte[]而不是Task<byte[]>。請致電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()方法的默認實現。 你想寫什麼是實際結果:

var taskResult = await response.GetContentAsStringAsync(); 

Console.WriteLine(taskResult.Result); 

你可以找到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'將簡單地調用'(任務).ToString()',你看到的是'ToString()'方法的默認實現。 – peval27

+0

@PaulKertscher感謝所有!也很有用!我覺得有一把瑞士軍刀,只是「知道」如何使用大鑰匙...... – Gonzo345

相關問題