一个很好的TDD友好的.NET文件IO库

时间:2009-07-07 19:31:41

标签: .net open-source file-io

正如你们许多人所知,System.IO命名空间设计得非常糟糕。我想要一个免费的库,以一种理智的方式包装文件IO功能(读取:不要求你在整个地方传递字符串)。我记得前一段时间读过这些库中已经写了一小部分(并且作者对此没有更多感到惊讶)。我认为这是devliciouscodebetterLos Techies中的其中一个人做过其中一个人。

有谁知道我在谈论什么或另一个好的文件IO包装器?

编辑:我想我应该指定我做测试驱动开发,我的担忧主要(但不完全)围绕System.IO的测试友好性。

5 个答案:

答案 0 :(得分:3)

System.IO.FileInfo有什么问题?


我很好奇,所以开始使用ReSharper创建一组包装器。它花了我16分钟,我没有测试过,也不知道它是否符合你的需求。不过,我想我会概述我使用的过程:

  1. 创建新的类库项目
  2. 将Class1设为public并将其重命名为FileSystemInfoWrapper
  3. 为它提供一个FileSystemInfo类型的私有字段_fsi(解析该类以获取导入的命名空间)
  4. 单击该字段并选择“在构造函数中初始化”
  5. 再次点击该字段并使用ReSharper - >代码 - >生成(Alt + Ins);选择生成委派成员;点击“公开”以获取所有公共成员
  6. 同样适用于FileInfo,但也可以从FileSystemInfoWrapper派生并删除重复的成员(ReSharper本可以做得更好)
  7. 同样适用于DirectoryInfo,但也派生自FileSystemInfoWrapper并修复重复项
  8. 对于每个包装器,单击该类,然后使用ReSharper-> Refactor-> Extract Interface
  9. 让IFileInfoWrapper和IDirectoryInfoWrapper从IFileSystemInfoWrapper派生,并删除重复项。
  10. 结果是包含相应类的方法和属性的接口,以及委托给原始类并实现接口的具体类。然后,您应该能够创建自己的模拟类,并更改代码以使用接口,而不是直接使用System.IO具体类。

答案 1 :(得分:3)

我认为您正在寻找this questionthis blog post。 我只包装了System.IO.File和System.IO.Directory。没有FileInfo或其他东西。

答案 2 :(得分:2)

我很好奇System.IO命名空间的设计是如此糟糕。当然,选择一个特定的接口或类可能有点武断,但我不熟悉必须在整个地方传递字符串的问题。

也许您可以提供有关您的特定问题的更多信息?


修改

您似乎表明您希望构建在System.IO命名空间上的类允许您在不写入文件系统的情况下进行测试。我没有看到如何在没有它的情况下充分测试写入文件系统的函数,以及写入文件系统。如果您想从写作角度测试您的逻辑,那么允许您使用System.IO.StreamSystem.IO.TextWriter,以更合适的方式。这样您就可以测试代码的各个组件,而不会产生任何外部影响;只需传递System.IO.MemoryStream而不是System.IO.FileStream。显然,您不会遇到诸如空间不足,访问被拒绝等问题,但如果不对文件系统进行实时运行,您将无法遇到这些错误。这就是为什么你可以公开带有System.IO.FileInfo或字符串路径(或任何你需要的数组/ IEnumerable<>)的外部函数,它们可以提供另一个级别的测试。

System.IO名称空间填充得非常好,而且我从未遇到过使用过的非OO方法。

答案 3 :(得分:2)

好的,我去挖掘了。 This是我所指的文章。

this是API(从ndepend项目中生成

答案 4 :(得分:0)

http://systemwrapper.codeplex.com提供了一套非常全面的适配器。你会发现几乎所有的System.IO都被包装了,还有很多其他的System命名空间(如果你正在使用时间敏感的计算,包装DateTime类总是一个很好的举动。)