关于 c#:将字符串作为文本文件上传到 SkyDrive?

Uploading string as text file to SkyDrive?

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

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

其中 LiveSignin() 是处理登录代码并返回 LiveConnectClient 的函数,而 getFolder(LiveConnectClient 客户端) 是获取我尝试上传到的文件夹 ID 的函数。

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

对于早期版本的 Windows Runtime/Live Connect(在另一个项目中),我曾使用过:

1
2
3
4
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",但现在我遇到了与此相同的错误

An unhandled exception of type 'System.AccessViolationException'
occurred in Windows.Foundation.winmd

Additional information: Attempted to read or write protected memory.
This is often an indication that other memory is corrupt

现在的代码:

1
2
3
4
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);


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

我的解决方案如下所示:

1
2
3
4
5
6
7
8
9
10
11
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);