.NET文件系统包装库

9

出于某些原因,我找不到一个.NET IO库的封装器,但一定有人已经创建了。我想能够模拟对File.Exists等函数的调用,而内置的静态方法并不适合这种场景。


请解释一下你所说的“内置的静态方法在这方面表现不佳”是什么意思。你需要哪些功能,而.NET没有提供? - Brandon Montgomery
3
依赖注入、模拟和其他在静态方法和类中非常困难的事情。 - leora
6个回答

10

我在你之前几分钟找到了SystemWrapper,但是你的更适合我的需求。


3

还有一个FileInfo类,它和静态方法做的事情一样。

另一方面,您可能不想模拟整个FileInfo类。相反,您想将所有文件操作放入单个类中,然后从该类中提取一个接口(描述公共方法),并使用该接口来模拟您执行的文件操作,而不是Microsoft认为应该在FileInfo类中包含的全部操作。


3

所有的答案都不错,但它们都让我回到起点 - 为每个我要工作的项目重新创建某种IFileSystem。最终我创建了一个通用的IFileSystem库,基于.NET库,可以在我所有的项目中重复使用。虽然不是很好,但现在它能够正常工作。


1

https://github.com/tathamoddie/System.IO.Abstractions 允许您执行此操作(来自 github 的示例)

public class MyComponent
{
readonly IFileSystem fileSystem;

// <summary>Create MyComponent with the given fileSystem implementation</summary>
public MyComponent(IFileSystem fileSystem)
{
    this.fileSystem = fileSystem;
}
/// <summary>Create MyComponent</summary>
public MyComponent() : this( 
    fileSystem: new FileSystem() //use default implementation which calls System.IO
) 
{
}

public void Validate()
{
    foreach (var textFile in fileSystem.Directory.GetFiles(@"c:\", "*.txt", SearchOption.TopDirectoryOnly))
    {
        var text = fileSystem.File.ReadAllText(textFile);
        if (text != "Testing is awesome.")
            throw new NotSupportedException("We can't go on together. It's not me, it's you.");
    }
}
}

1

我在 CodePlex 上维护 Jolt.NET 项目,其中包含一个库,可以为您生成这些接口及其实现。请参考 Jolt.Testing 库以获取更多信息。


1
如果你将其迁移到Github并创建一个Nuget包,那么更多人会使用它。仅因为这个原因我甚至不会仔细研究它... - CodingYourLife

0

不要寻找一个封装整个文件系统的库,为什么不创建一个简单的IFileSystem接口并开始添加您所需的方法。

应用程序的其余部分应该依赖于IFileSystem,这将允许模拟。

您可以拥有一个实现,它只是调用.Net给您的静态方法,然后您的代码可以依赖于这个接口。


3
这是我过去的做法,但我厌倦了在每个项目中不断重新创建这个界面。希望在这里实现一些代码重用。 - Sneal
将其放入共享库中,并在所有项目中引用它。 - leora
3
我猜 Sneal 的想法是 "为什么要自己创造,而不是使用一些开源的、可能比你公司内部的解决方案更成熟的项目"。这是关于“不重复造轮子”的问题。 - Piotr Owsiak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接