2012-04-24 87 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); 
相关问题