2012-04-24 84 views
18

我在windows-8中創建一個StreamWriter對象時遇到了麻煩,通常我只是創建一個實例,只是傳遞一個字符串作爲參數,但在Windows 8中,我收到一個錯誤,指示它應該接收一個Stream,但是我注意到Stream是一個抽象類,有人知道如何將代碼寫入一個XML文件嗎?順便說一句,我使用.xml因爲我想保存序列化的對象,或者沒有人知道如何保存到文件中序列化的對象在Windows 8中?如何在Windows 8中使用StreamWriter寫入文件?

任何想法?

目前使用的是Windows 8消費者預覽版

代碼:

StreamWriter sw = new StreamWriter("person.xml");

錯誤:

The best overloaded method match for 'System.IO.StreamWriter.StreamWriter(System.IO.Stream)' has some invalid arguments

+1

這與Windows 8或任何操作系統無關。你只需要將正確的參數傳遞給構造函數。當它說它需要一個'Stream'時,你必須使用一個擴展'Stream'的類。我建議你* google *關於'Stream'。我得到的第一個結果顯示瞭如何使用它的視頻(http://www.youtube.com/watch?v=QKGjWMlba9s) – MilkyWayJoe 2012-04-24 02:15:21

+1

感謝您的快速回復,但實際上我知道如何使用StreamWriter類,但在這種情況下,我創建了一個Windows Metro樣式項目,並且我正在使用XAML,而StreamWriter類不能像以前在Windows窗體應用程序中一樣工作,我只是遇到了這個錯誤,甚至我嘗試了你建議(創建一個擴展Stream類的類),它只是實現空方法,並沒有一個方法接收作爲參數的流將被創建的路徑... – 2012-04-24 02:37:27

+0

...,我在谷歌中找到的所有,只顯示我知道如何創建StreamWriter對象的方式,我找不到任何指示如何在Windows Metro項目中創建StreamWriter或Stream的引用。有人在Windows Metro項目中使用Streams,使用StreamWriter編寫文件的代碼如何? – 2012-04-24 02:38:03

回答

27

相反的StreamWriter,你會使用這樣的:

StorageFolder folder = ApplicationData.Current.LocalFolder; 
StorageFile file = await folder.CreateFileAsync(); 

using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
{ 
    using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0)) 
    { 
     using (DataWriter dataWriter = new DataWriter(outputStream)) 
     { 
      //TODO: Replace "Bytes" with the type you want to write. 
      dataWriter.WriteBytes(bytes); 
      await dataWriter.StoreAsync(); 
      dataWriter.DetachStream(); 
     } 

     await outputStream.FlushAsync(); 
    } 
} 

您可以查看WinRTXamlToolkit庫中的StringIOExtensions類以供示例使用。

編輯*

雖然上述所有應該工作 - 他們的FileIO類在WinRT中,從而簡化了大多數常見的情況是,上述解決方案解決了,因爲現在你只需撥打await FileIO.WriteTextAsync(file, contents)寫面世之前寫文本到文件中,並且也有類似的方法來讀取,寫入或附加字符串,字節,字符串列表或IBuffers

+0

謝謝Filip !!,WinRTXamlToolkit幫助我很多! – 2012-04-24 15:47:28

+0

很高興能幫到您 – 2012-04-24 15:48:18

+0

感謝您使用'FileIO'的更新建議,適合我。 – Jonathan 2017-04-17 23:36:23

4

您可以創建您可以通過從應用程序中使用這樣的

private async Task<T> ReadXml<T>(StorageFile xmldata) 
    { 
     XmlSerializer xmlser = new XmlSerializer(typeof(List<myclass>)); 
     T data; 
     using (var strm = await xmldata.OpenStreamForReadAsync()) 
     { 
      TextReader Reader = new StreamReader(strm); 
      data = (T)xmlser.Deserialize(Reader); 
     } 
     return data; 
    } 

    private async Task writeXml<T>(T Data, StorageFile file) 
    { 
     try 
     { 
      StringWriter sw = new StringWriter(); 
      XmlSerializer xmlser = new XmlSerializer(typeof(T)); 
      xmlser.Serialize(sw, Data); 

      using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
      { 
       using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0)) 
       { 
        using (DataWriter dataWriter = new DataWriter(outputStream)) 
        { 
         dataWriter.WriteString(sw.ToString()); 
         await dataWriter.StoreAsync(); 
         dataWriter.DetachStream(); 
        } 

        await outputStream.FlushAsync(); 
       } 
      } 


     } 
     catch (Exception e) 
     { 
      throw new NotImplementedException(e.Message.ToString()); 

     } 

    } 

編寫XML和普通的靜態方法只需使用

StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("data.xml",CreationCollisionOption.ReplaceExisting); 
     await writeXml(Data,file); 

和讀取XML使用

StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("data.xml"); 
     Data = await ReadXml<List<myclass>>(file); 
相關問題