2012-08-18 59 views
1

我正在尝试使用C#与Live Connect API上传一个空白(或称“测试”)文本文件到SkyDrive。该代码我到目前为止有:将字符串作为文本文件上传到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运行时的/活动连接(在其他项目中)我用了:

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”,但现在我得到相同的错误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); 
+0

我得到了同样的异常,有没有办法解决。 – Sean 2012-08-26 12:48:18

回答

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