StreamReader 和可移植类库

Posted

技术标签:

【中文标题】StreamReader 和可移植类库【英文标题】:StreamReader and Portable Class Library 【发布时间】:2013-08-09 05:44:20 【问题描述】:

我正在使用可移植类库编写一个 ConfigManager 类。 PCL 支持我想使用的StreamReaderStreamWriter 类,但是这些类的PCL 版本不支持在构造过程中传入字符串。 PCL 也不支持reader.Close()writer.Close()。最后它不支持FileStream 类。

所以我正在寻找以下任一问题的答案:

    如何让StreamReaderStreamWriter 类正常工作 在 PCL 中? 如何使用 PCL 创建新的stream? 在 PCL 中加载和保存文件还有哪些其他选择?

【问题讨论】:

是否支持释放流对象?因为那应该关闭它就好了。 而不是.Close() 使用.Dispose(),没有没有解决方案,因为没有问题...文件系统访问必须抽象 只是针对接口的代码。检查:[链接]hthttps://pclstorage.codeplex.comlink 【参考方案1】:

在这里找到了答案(Rob Caplan):http://social.msdn.microsoft.com/Forums/windowsapps/en-US/386eb3b2-e98e-4bbc-985f-fc143db6ee36/read-local-file-in-portable-library#386eb3b2-e98e-4bbc-985f-fc143db6ee36

文件访问不能在 Windows 应用商店应用程序和 Windows Phone 8 应用程序。您将不得不使用特定于平台的代码, 打开文件并获取流。然后,您可以将流传递到 PCL。

由于 Windows 应用商店应用和 Windows Phone 8 应用都使用 基本上相同的 Windows(电话)运行时类 Windows.Storage 打开文件可以共享代码(但不是 二进制)通过在两个项目之间链接代码文件。查看分享 添加为链接的代码。

有关更多信息,请参阅最大化 Windows Phone 8 和 Windows 8 之间的代码重用 共享代码的技术。

如果有人有除此之外的解决方案,我很想听听;还想知道 PCL 中的 .Close() 方法。

【讨论】:

【参考方案2】:

使用Dispose() 而不是Close()(或者只是将所有内容包装在 using 语句中)。我们已经在 Windows 应用商店应用和更新的 PCL 中隐藏/删除了Close(),因为它做同样的事情,人们会不知道该调用哪个。

考虑使用PCL Storage 进行跨平台文件系统访问。

以下是您可能想要参考的一些博客文章,了解如何在 PCL 中处理特定于平台的功能:

How to Make Portable Class Libraries Work for You Portable Class Library Enlightenment / Adaptation Using Target-Specific Code in a Portable Library

【讨论】:

PCLStorage 是异步的,这通常很不方便。特别是在 System.IO 存在于所有平台上的 .NET/Xamarin/WP8 上使用异步 PCLStorage 是很可悲的。 致任何阅读此答案并使用 PCL 存储的人。 PCL 存储不再维护,我建议不要在生产应用程序中使用它。更喜欢使用依赖注入实现自己的存储解决方案

以上是关于StreamReader 和可移植类库的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 3、Razor 视图和可移植区域

当 Stream.Read() 存在时,StreamReader 的目的是啥?

c#学习笔记02----自定义类库及反编译

C# Stream.Read 超时

c#streamreader 有的机器乱码有的不乱吗

FileStream和StreamReader,StreamWrite,BinaryWriter