【问题标题】:How write a file using StreamWriter in Windows 8?如何在 Windows 8 中使用 StreamWriter 写入文件?
【发布时间】:2014-07-12 01:05:34
【问题描述】:

在 windows-8 中创建 StreamWriter 对象时遇到问题,通常我只是创建一个实例,只是将字符串作为参数传递,但在 Windows 8 中,我收到一个错误,表明它应该接收一个 Stream ,但我注意到 Stream 是一个抽象类,有人知道如何编写 xml 文件的代码吗?顺便说一句,我使用 .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

【问题讨论】:

  • 这与 Windows 8 或任何操作系统无关。您只需将正确的参数传递给构造函数。当它说它需要Stream 时,您必须使用扩展Stream 的类。我建议您google 了解Stream。我得到的第一个结果甚至显示了如何使用它的视频 (youtube.com/watch?v=QKGjWMlba9s)
  • 感谢您的快速回复,但实际上我知道如何使用 StreamWriter 类,但在这种情况下,我创建了一个 Windows Metro Style 项目,我正在使用 XAML 和 StreamWriter 类不像以前在 Windows 窗体应用程序中那样工作,我只是收到这个错误,即使我尝试了你建议的(创建一个扩展 Stream 类的类),它只是实现了空方法并且没有一个方法接收将创建流的路径作为参数...
  • ...,我在 google 中找到的所有内容,只是显示我知道如何创建 StreamWriter 对象的方式,我找不到任何指示如何创建 StreamWriter 或 Stream in一个 Windows Metro 项目。有人在 Windows Metro 项目中使用 Streams,使用 StreamWriter 编写文件的代码将如何?
  • 这是 WinRT 的根本变化之一。您不能再将文件写入您想要的任何地方,您必须使用隔离存储。并且您需要使用带有 await 关键字的异步 I/O。暂时找不到好例子,也没有接近Win8机器。
  • 谢谢汉斯,我想这就是我所期待的答案,能否请您提供一个链接,我可以在其中找到有关您刚刚回答的更多信息。提前致谢。

标签: c# windows-8 windows-runtime


【解决方案1】:

你可以使用类似这样的东西来代替 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

【讨论】:

  • 感谢使用FileIO 的更新建议,对我有用。
【解决方案2】:

你可以创建一个通用的静态方法,你可以像这样在整个应用程序中使用它

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

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 2014-06-22
    • 2020-05-23
    • 1970-01-01
    • 2014-02-22
    • 2018-08-24
    • 2011-10-29
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多