1

我正在尝试将 C# 与 Live Connect API 一起使用,将空白(或显示“测试”的)文本文件上传到 SkyDrive。我到目前为止的代码:

LiveConnectClient client = await LiveSignin();
string folderID = await getFolder(client);
client.BackgroundUploadAsync(folderID, "pins.txt", "", OverwriteOption.Rename);

其中 LiveSignin() 是一个处理登录代码并返回 LiveConnectClient 的函数,而 getFolder(LiveConnectClient client) 是一个获取我要上传到的文件夹 ID 的函数。

该代码抛出一个关于空白字符串(最后一行的第三个参数)必须是“Windows.Storage.Streams.IInputStream”的错误,但我似乎找不到任何关于如何将字符串转换为 IInputStream 的文档,或者,就此而言,我可以找到关于“IInputStream”的大部分文档。

对于早期版本的 Windows 运行时/实时连接(在另一个项目中),我使用过:

byte[] byteArray = System.Text.Encoding.Unicode.GetBytes(Doc);
MemoryStream stream = new MemoryStream(byteArray);
App.client.UploadCompleted += client_UploadCompleted;
App.client.UploadAsync(roamingSettings.Values["folderID"].ToString(), docTitle.Text + ".txt", stream);

但是现在会引发很多错误(其中大部分是因为 UploadAsync 已被 BackgroundUploadAsync 取代)。

那么,有没有办法将字符串转换为 IInputStream,或者我什至不需要使用 IInputStream?如果我的方法不起作用,如何从 C# Metro 应用程序将空白文本文件上传到 SkyDrive?(在 Visual Studio 2012 Express 中对 Windows 8 Enterprise 的评估进行开发,如果这有很大的不同的话)

编辑:我终于找到了“Stream.AsInputStream”,但现在我遇到了与此相同的错误

Windows.Foundation.winmd 中发生了“System.AccessViolationException”类型的未处理异常

附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏

现在的代码:

LiveConnectClient client = await LiveSignin();
string folderID = await getFolder(client);
Stream OrigStream = new System.IO.MemoryStream(System.Text.UTF8Encoding.UTF8.GetBytes("test"));
LiveOperationResult result = await client.BackgroundUploadAsync(folderID, "pins.txt", OrigStream.AsInputStream(), OverwriteOption.Rename);
4

1 回答 1

0

你好

今天遇到了同样的问题,据我所知,解决这个问题的唯一方法是先将您的文本写入本地文件,然后再上传。

我的解决方案如下所示:

var tmpFile= await ApplicationData.Current.
                       LocalFolder.CreateFileAsync
                         ("tmp.txt", CreationCollisionOption.ReplaceExisting);

using (var writer = new StreamWriter(await tmpFile.OpenStreamForWriteAsync()))
{
    await writer.WriteAsync("File content");
}
var operationResult = 
      await client.BackgroundUploadAsync(folderId, tmpFile.Name, tmpFile,
                                          OverwriteOption.Overwrite);
于 2012-08-30T14:16:11.737 回答