2017-01-30 1 views
0

J'ai lutté contre l'API Dropbox et j'ai fait mes petits pas (je suis nouveau sur C#). Le fait est que j'ai finalement atteint un fichier sur mon compte Dropbox mais je ne sais pas comment le créer sur ma machine locale via StreamWriter.Comment écrire un fichier Dropbox (via son API) en utilisant StreamWriter en C#?

Note: Je sais que la chose await et ainsi de suite pourrait être facilement améliorée, mais je reçois toujours en elle: «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(); 
       } 
      } 
     } 
    } 
} 

Le point va à sw.Write, où je « essaie de insérer "la réponse que je reçois sur la console mais je viens d'obtenir ce" System.Threading.Tasks.Task`1 [System.Byte []] "à la place.

Merci d'avance et désolé pour le n00bance. Nouveau sur API C# et Dropbox.

+0

Divisez cet appel en 'var response = wait response ...' et imprimez la propriété que vous voulez imprimer. – Fildor

Répondre

2

Vous avez écrit les suivantes:

sw.Write(response.GetContentAsByteArrayAsync()); 

Quoi qu'il en soit, la signature de la méthode est

Task<byte[]> GetContentAsByteArrayAsync() 

Par conséquent, vous passez un Task<byte[]> à sw.Write(...). Le comportement par défaut de StreamWriter.Write - pour un objet transmis - est write the text representation of an object - qui est le nom du type pour de nombreuses classes - c'est ce que vous avez vu. En outre, vous avez oublié d'effectuer l'opération asynchrone await, par conséquent vous avez un Task<byte[]>. Vous devrez await l'appel afin d'obtenir le byte[] réel et non le Task<byte[]>. Voir l'appel au GetContentAsStringAsync.

Puisque vous souhaitez écrire un tableau de byte s ici, vous n'avez pas besoin d'un StreamWriter, mais peut fonctionner sur brut (bien pas exactement, mais plus brut qu'un StreamWriter) les cours d'eau.

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

Si vous consultez les documents de l'API Dropbox, la méthode GetContentAsStringAsync()async renvoie Task<string>. Console.Writeline appellera simplement Task<string>.ToString() et ce que vous voyez est l'implémentation par défaut de la méthode ToString(). Qu'est-ce que vous voulez écrire est le résultat réel:

var taskResult = await response.GetContentAsStringAsync(); 

Console.WriteLine(taskResult.Result); 

Vous trouverez plus d'informations sur MSDN

0

Bon, j'ai finalement trouvé une solution!

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

D'accord, la magie de ToString n'était pas tout ce que la magie XD Merci les gars! WriteLine imprime la représentation sous forme de chaîne de l'objet Tâche retourné.

+1

Veuillez voir ma réponse: Vous avez oublié le 'await' et passé une' tâche 'à' sw.Write (...) '. Le 'ToString' n'est pas du tout bizarre. –

+0

ce n'est pas bizarre. 'Console.Writeline' appellera simplement' (tâche ) .ToString() 'et ce que vous voyez est l'implémentation par défaut de la méthode' ToString() '. – peval27

+0

@PaulKertscher Merci pour tout! Utile aussi! J'ai envie d'avoir un couteau suisse et de "savoir" comment utiliser la grosse clé ... – Gonzo345