2012-08-18 58 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);