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