将字符串作为文本文件上传到SkyDrive?

时间:2012-08-18 03:03:42

标签: c# onedrive

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

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(在另一个项目上):

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企业版,如果这有很大不同)

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

  

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

中      

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

现在的代码:

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 个答案:

答案 0 :(得分: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);