如何在 C# 中使用 StreamWriter 编写 Dropbox 文件(通过他们的 API)?
How to write a Dropbox file (through their API) using StreamWriter in C#?
我一直在与 Dropbox API 作斗争,并且已经取得了一些进展(我是 C# 的新手)。问题是我终于在我的 Dropbox 帐户上找到了一个文件,但我不知道如何通过 StreamWriter 在我的本地计算机上创建它。
注意:我知道 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,我 "try to insert" 在控制台上得到的响应,但我只是得到这个 "System.Threading.Tasks.Task`1[System.Byte[]]"。
提前致谢,对 n00bance 表示抱歉。 C# 和 Dropbox 的新增功能 API.
查看 Dropbox API 文档,GetContentAsStringAsync()
方法是 async
returns Task<string>
。 Console.Writeline
将简单地调用 Task<string>.ToString()
,您看到的是 ToString()
方法的默认实现。
你要写的是实际结果:
var taskResult = await response.GetContentAsStringAsync();
Console.WriteLine(taskResult.Result);
您可以在 MSDN
上找到更多信息
您写了以下内容:
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
,但可以对raw进行操作(不完全是,但比 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();
}
好的,我终于找到解决办法了!
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 谢谢大家!
我一直在与 Dropbox API 作斗争,并且已经取得了一些进展(我是 C# 的新手)。问题是我终于在我的 Dropbox 帐户上找到了一个文件,但我不知道如何通过 StreamWriter 在我的本地计算机上创建它。
注意:我知道 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,我 "try to insert" 在控制台上得到的响应,但我只是得到这个 "System.Threading.Tasks.Task`1[System.Byte[]]"。
提前致谢,对 n00bance 表示抱歉。 C# 和 Dropbox 的新增功能 API.
查看 Dropbox API 文档,GetContentAsStringAsync()
方法是 async
returns Task<string>
。 Console.Writeline
将简单地调用 Task<string>.ToString()
,您看到的是 ToString()
方法的默认实现。
你要写的是实际结果:
var taskResult = await response.GetContentAsStringAsync();
Console.WriteLine(taskResult.Result);
您可以在 MSDN
上找到更多信息您写了以下内容:
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
,但可以对raw进行操作(不完全是,但比 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();
}
好的,我终于找到解决办法了!
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 谢谢大家!