如何在Windows 8中使用StreamWriter编写文件?

我在windows-8中创建一个StreamWriter对象时遇到了麻烦,通常我只是创建一个实例,只是将一个字符串作为参数传递,但是在Windows 8中我得到一个错误,表明它应该接收一个Stream,但我注意到了Stream是一个抽象类,有谁知道编写xml文件的代码怎么样?BTW我正在使用.xml因为我想保存序列化对象,或者有人知道如何将序列化对象保存到文件中在Windows 8中?

有任何想法吗?

目前正在使用Windows 8 Consumer Preview

码:

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

错误:

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

而不是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方法也类似。

您可以创建一个通用的静态方法,您可以通过这样的应用程序使用它

  private async Task ReadXml(StorageFile xmldata) { XmlSerializer xmlser = new XmlSerializer(typeof(List)); 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 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>(file);