System.IO.Abstractions 21.0.26

System.IO.Abstractions NuGet Continuous Integration Codacy Badge Renovate enabled FOSSA Status

At the core of the library is IFileSystem and FileSystem. Instead of calling methods like File.ReadAllText directly, use IFileSystem.File.ReadAllText. We have exactly the same API, except that ours is injectable and testable.

Usage

dotnet add package TestableIO.System.IO.Abstractions.Wrappers

Note: This NuGet package is also published as System.IO.Abstractions but we suggest to use the prefix to make clear that this is not an official .NET package.

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.");
        }
    }
}

Test helpers

The library also ships with a series of test helpers to save you from having to mock out every call, for basic scenarios. They are not a complete copy of a real-life file system, but they'll get you most of the way there.

dotnet add package TestableIO.System.IO.Abstractions.TestingHelpers

Note: This NuGet package is also published as System.IO.Abstractions.TestingHelpers but we suggest to use the prefix to make clear that this is not an official .NET package.

[Test]
public void MyComponent_Validate_ShouldThrowNotSupportedExceptionIfTestingIsNotAwesome()
{
    // Arrange
    var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
    {
        { @"c:\myfile.txt", new MockFileData("Testing is meh.") },
        { @"c:\demo\jQuery.js", new MockFileData("some js") },
        { @"c:\demo\image.gif", new MockFileData(new byte[] { 0x12, 0x34, 0x56, 0xd2 }) }
    });
    var component = new MyComponent(fileSystem);

    try
    {
        // Act
        component.Validate();
    }
    catch (NotSupportedException ex)
    {
        // Assert
        Assert.That(ex.Message, Is.EqualTo("We can't go on together. It's not me, it's you."));
        return;
    }

    Assert.Fail("The expected exception was not thrown.");
}

We even support casting from the .NET Framework's untestable types to our testable wrappers:

FileInfo SomeApiMethodThatReturnsFileInfo()
{
    return new FileInfo("a");
}

void MyFancyMethod()
{
    var testableFileInfo = (FileInfoBase)SomeApiMethodThatReturnsFileInfo();
    ...
}

Mock support

Since version 4.0 the top-level APIs expose interfaces instead of abstract base classes (these still exist, though), allowing you to completely mock the file system. Here's a small example, using Moq:

[Test]
public void Test1()
{
    var watcher = Mock.Of<IFileSystemWatcher>();
    var file = Mock.Of<IFile>();

    Mock.Get(file).Setup(f => f.Exists(It.IsAny<string>())).Returns(true);
    Mock.Get(file).Setup(f => f.ReadAllText(It.IsAny<string>())).Throws<OutOfMemoryException>();

    var unitUnderTest = new SomeClassUsingFileSystemWatcher(watcher, file);

    Assert.Throws<OutOfMemoryException>(() => {
        Mock.Get(watcher).Raise(w => w.Created += null, new System.IO.FileSystemEventArgs(System.IO.WatcherChangeTypes.Created, @"C:\Some\Directory", "Some.File"));
    });

    Mock.Get(file).Verify(f => f.Exists(It.IsAny<string>()), Times.Once);

    Assert.True(unitUnderTest.FileWasCreated);
}

public class SomeClassUsingFileSystemWatcher
{
    private readonly IFileSystemWatcher _watcher;
    private readonly IFile _file;

    public bool FileWasCreated { get; private set; }

    public SomeClassUsingFileSystemWatcher(IFileSystemWatcher watcher, IFile file)
    {
        this._file = file;
        this._watcher = watcher;
        this._watcher.Created += Watcher_Created;
    }

    private void Watcher_Created(object sender, System.IO.FileSystemEventArgs e)
    {
        FileWasCreated = true;

        if(_file.Exists(e.FullPath))
        {
            var text = _file.ReadAllText(e.FullPath);
        }
    }
}

Showing the top 20 packages that depend on System.IO.Abstractions.

Packages Downloads
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
20
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
19
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
18
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
17
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
16
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
15

Version Downloads Last updated
21.0.29 8 07/25/2024
21.0.26 8 07/14/2024
21.0.22 8 06/25/2024
21.0.2 12 03/24/2024
20.0.34 8 03/25/2024
20.0.28 12 03/13/2024
20.0.15 11 01/30/2024
20.0.4 10 01/04/2024
20.0.1 11 01/01/2024
19.2.91 11 01/09/2024
19.2.87 11 12/28/2023
19.2.69 14 11/03/2023
19.2.67 14 11/07/2023
19.2.66 12 01/04/2024
19.2.64 13 01/05/2024
19.2.63 12 12/26/2023
19.2.61 12 01/02/2024
19.2.51 17 08/14/2023
19.2.50 16 12/25/2023
19.2.29 12 01/03/2024
19.2.26 15 07/04/2023
19.2.25 15 10/27/2023
19.2.22 15 01/05/2024
19.2.18 14 01/06/2024
19.2.17 15 07/17/2023
19.2.16 11 07/05/2023
19.2.15 13 09/05/2023
19.2.13 21 07/04/2023
19.2.12 15 08/20/2023
19.2.11 15 01/01/2024
19.2.9 17 09/14/2023
19.2.8 14 09/14/2023
19.2.4 15 07/31/2023
19.2.1 19 10/15/2023
19.1.18 12 08/20/2023
19.1.14 13 12/27/2023
19.1.13 10 01/05/2024
19.1.5 12 07/18/2023
19.1.1 13 11/06/2023
19.0.1 11 10/28/2023
18.0.1 12 01/05/2024
17.2.26 12 01/05/2024
17.2.3 16 08/19/2023
17.2.1 11 12/14/2023
17.1.1 10 01/01/2024
17.0.28 11 01/06/2024
17.0.24 13 10/12/2023
17.0.23 18 10/23/2023
17.0.21 16 08/01/2023
17.0.18 12 01/06/2024
17.0.15 15 10/10/2023
17.0.14 18 11/21/2023
17.0.13 14 01/06/2024
17.0.12 14 12/12/2023
17.0.11 13 01/06/2024
17.0.10 16 12/18/2023
17.0.9 12 09/09/2023
17.0.8 14 07/12/2023
17.0.7 12 08/19/2023
17.0.6 13 10/18/2023
17.0.5 12 12/28/2023
17.0.4 19 07/06/2023
17.0.3 12 01/06/2024
17.0.2 16 08/20/2023
17.0.1 12 01/06/2024
16.1.26 14 08/20/2023
16.1.25 17 11/09/2023
16.1.24 15 12/25/2023
16.1.23 14 10/16/2023
16.1.22 12 01/06/2024
16.1.21 15 01/06/2024
16.1.20 13 01/05/2024
16.1.19 14 01/06/2024
16.1.18 13 01/03/2024
16.1.17 12 01/06/2024
16.1.16 13 11/10/2023
16.1.15 9 01/06/2024
16.1.14 16 11/17/2023
16.1.13 10 01/06/2024
16.1.12 15 12/31/2023
16.1.11 12 11/25/2023
16.1.10 13 12/29/2023
16.1.9 14 01/05/2024
16.1.8 12 01/04/2024
16.1.7 12 01/06/2024
16.1.6 10 12/12/2023
16.1.5 11 01/06/2024
16.1.4 10 01/06/2024
16.1.2 11 11/06/2023
16.1.1 9 12/31/2023
16.0.8 12 11/26/2023
16.0.7 13 12/02/2023
16.0.6 14 11/24/2023
16.0.5 10 11/17/2023
16.0.4 18 12/05/2023
16.0.3 12 01/06/2024
16.0.2 14 11/16/2023
16.0.1 14 12/09/2023
15.0.1 12 12/14/2023
14.0.13 13 01/06/2024
14.0.12 11 10/22/2023
14.0.11 13 12/23/2023
14.0.10 11 01/06/2024
14.0.9 11 12/16/2023
14.0.8 11 01/05/2024
14.0.7 9 01/06/2024
14.0.6 9 01/15/2024
14.0.5 12 01/01/2024
14.0.4 11 01/06/2024
14.0.3 12 01/05/2024
14.0.2 13 01/05/2024
14.0.1 11 01/06/2024
13.2.47 13 11/15/2023
13.2.46 13 01/06/2024
13.2.45 18 11/15/2023
13.2.43 16 01/04/2024
13.2.42 13 12/28/2023
13.2.41 14 11/07/2023
13.2.40 12 01/06/2024
13.2.39 10 12/08/2023
13.2.38 14 01/06/2024
13.2.37 13 12/13/2023
13.2.36 10 01/06/2024
13.2.35 12 01/01/2024
13.2.34 12 11/23/2023
13.2.33 12 01/05/2024
13.2.32 13 01/06/2024
13.2.31 11 01/06/2024
13.2.30 12 01/02/2024
13.2.29 8 02/15/2024
13.2.28 12 11/10/2023
13.2.27 9 12/28/2023
13.2.25 7 12/13/2023
13.2.24 11 01/20/2024
13.2.23 7 02/14/2024
13.2.22 12 01/06/2024
13.2.20 9 01/06/2024
13.2.19 14 01/06/2024
13.2.18 13 01/06/2024
13.2.17 9 12/21/2023
13.2.16 11 01/06/2024
13.2.15 11 01/06/2024
13.2.14 12 01/05/2024
13.2.13 8 01/06/2024
13.2.12 8 01/04/2024
13.2.11 10 12/05/2023
13.2.10 11 01/06/2024
13.2.9 12 01/06/2024
13.2.8 10 12/09/2023
13.2.7 9 01/06/2024
13.2.6 11 12/11/2023
13.2.5 13 11/19/2023
13.2.4 8 12/31/2023
13.2.3 8 01/04/2024
13.2.2 12 12/22/2023
13.2.1 13 12/31/2023
13.1.2 12 12/27/2023
13.1.1 12 01/02/2024
13.0.1 13 09/24/2023
12.2.27 10 01/06/2024
12.2.26 12 12/06/2023
12.2.25 11 01/05/2024
12.2.24 13 11/10/2023
12.2.23 9 01/05/2024
12.2.22 11 01/06/2024
12.2.21 9 12/31/2023
12.2.20 10 12/21/2023
12.2.19 10 12/31/2023
12.2.7 13 01/06/2024
12.2.6 12 12/05/2023
12.2.5 9 01/06/2024
12.2.4 10 01/06/2024
12.2.3 12 12/19/2023
12.2.2 10 01/06/2024
12.2.1 10 01/06/2024
12.1.11 11 01/05/2024
12.1.10 12 09/25/2023
12.1.9 8 01/06/2024
12.1.2 10 01/05/2024
12.1.1 15 10/27/2023
12.0.13 9 12/23/2023
12.0.10 12 12/28/2023
12.0.9 17 12/21/2023
12.0.8 12 01/05/2024
12.0.7 12 01/05/2024
12.0.6 17 10/29/2023
12.0.5 10 11/12/2023
12.0.4 13 01/03/2024
12.0.3 12 12/27/2023
12.0.2 10 12/30/2023
12.0.1 10 01/05/2024
11.0.18 12 01/05/2024
11.0.17 10 01/05/2024
11.0.16 11 01/05/2024
11.0.15 13 01/03/2024
11.0.14 12 01/05/2024
11.0.13 11 10/20/2023
11.0.12 14 12/03/2023
11.0.11 10 12/31/2023
11.0.10 13 01/05/2024
11.0.9 14 01/05/2024
11.0.8 13 01/05/2024
11.0.7 11 01/05/2024
11.0.6 11 12/28/2023
11.0.5 12 12/09/2023
11.0.4 15 11/04/2023
11.0.3 17 12/31/2023
11.0.2 11 01/05/2024
11.0.1 17 12/09/2023
10.0.10 10 11/30/2023
10.0.9 9 11/25/2023
10.0.8 13 01/05/2024
10.0.7 14 01/05/2024
10.0.6 14 11/24/2023
10.0.5 14 12/14/2023
10.0.4 12 09/29/2023
10.0.1 10 12/16/2023
9.0.6 12 01/04/2024
9.0.5 10 01/05/2024
9.0.4 14 12/31/2023
9.0.3 15 10/11/2023
9.0.2 12 12/10/2023
9.0.1 13 01/05/2024
8.1.1 14 12/21/2023
8.0.6 13 12/17/2023
8.0.5 10 12/05/2023
8.0.4 14 01/02/2024
8.0.3 11 01/04/2024
7.1.10 10 01/09/2024
7.1.8 11 12/03/2023
7.1.4 11 01/05/2024
7.1.3 11 12/31/2023
7.1.1 12 11/27/2023
7.0.16 12 01/02/2024
7.0.15 10 11/20/2023
7.0.7 13 12/16/2023
7.0.5 13 01/01/2024
7.0.4 14 12/19/2023
6.0.38 10 01/09/2024
6.0.36 11 01/02/2024
6.0.34 7 01/04/2024
6.0.32 13 12/03/2023
6.0.27 12 12/04/2023
6.0.25 9 09/15/2023
6.0.23 9 01/09/2024
6.0.21 14 09/27/2023
6.0.19 15 11/10/2023
6.0.17 14 12/13/2023
6.0.15 8 01/03/2024
6.0.14 11 10/10/2023
6.0.13 12 11/25/2023
6.0.11 16 10/31/2023
6.0.9 17 12/08/2023
6.0.7 13 01/03/2024
6.0.6 12 12/03/2023
6.0.5 12 11/04/2023
6.0.3 15 01/05/2024
6.0.1 12 12/30/2023
5.0.1 15 01/04/2024
4.2.17 14 01/09/2024
4.2.15 12 12/16/2023
4.2.13 11 01/04/2024
4.2.12 11 10/24/2023
4.2.10 12 01/03/2024
4.2.9 16 11/10/2023
4.2.8 11 01/03/2024
4.2.4 14 01/05/2024
4.1.6 12 01/04/2024
4.0.11 11 12/14/2023
3.1.1 16 12/04/2023
3.0.10 11 12/13/2023
3.0.2 12 12/02/2023
2.2.18-beta 13 11/29/2023
2.2.17-beta 14 10/22/2023
2.2.16-beta 13 11/23/2023
2.2.15-beta 12 09/24/2023
2.2.14-beta 11 01/03/2024
2.2.13-beta 15 09/30/2023
2.2.12-beta 10 01/09/2024
2.2.11-beta 12 11/14/2023
2.2.10-beta 8 01/09/2024
2.2.9-beta 9 12/19/2023
2.2.8-beta 12 01/04/2024
2.2.7-beta 12 01/09/2024
2.2.6-beta 10 01/09/2024
2.2.5-beta 8 01/04/2024
2.2.4-beta 13 01/02/2024
2.2.3-beta 11 01/02/2024
2.2.2-beta 12 12/15/2023
2.1.0.256 9 01/06/2024
2.1.0.247 10 11/26/2023
2.1.0.237 8 01/08/2024
2.1.0.236 12 01/06/2024
2.1.0.235 14 01/09/2024
2.1.0.234 11 01/09/2024
2.1.0.233 12 01/09/2024
2.1.0.232 12 01/06/2024
2.1.0.231 13 01/09/2024
2.1.0.230 13 01/06/2024
2.1.0.229 13 01/05/2024
2.1.0.228 12 01/07/2024
2.1.0.227 12 01/07/2024
2.1.0.226 13 12/23/2023
2.1.0.217 9 01/09/2024
2.1.0.216 10 01/09/2024
2.1.0.215 13 01/09/2024
2.1.0.214 12 01/09/2024
2.1.0.213 11 01/09/2024
2.1.0.211 11 01/09/2024
2.1.0.210 12 01/09/2024
2.1.0.209 10 12/21/2023
2.1.0.208 12 01/09/2024
2.1.0.207 8 01/09/2024
2.1.0.206 10 01/09/2024
2.1.0.205 12 01/08/2024
2.1.0.204 11 01/09/2024
2.1.0.203 11 01/09/2024
2.1.0.202 11 01/05/2024
2.1.0.201 13 01/09/2024
2.1.0.200 13 12/31/2023
2.1.0.199 12 01/09/2024
2.1.0.198 10 01/09/2024
2.1.0.197 8 02/14/2024
2.1.0.196 11 11/20/2023
2.1.0.195 9 01/09/2024
2.1.0.194 11 01/09/2024
2.1.0.193 12 11/21/2023
2.1.0.192 13 01/09/2024
2.1.0.191 11 01/09/2024
2.1.0.190 8 01/07/2024
2.1.0.189 12 11/01/2023
2.1.0.188 11 01/09/2024
2.1.0.187 9 01/05/2024
2.1.0.186 11 01/05/2024
2.1.0.185 9 11/27/2023
2.1.0.184 12 11/22/2023
2.1.0.183 9 01/05/2024
2.1.0.182 12 01/05/2024
2.1.0.181 14 01/05/2024
2.1.0.180 14 12/13/2023
2.1.0.179 12 01/05/2024
2.1.0.178 10 01/05/2024
2.1.0.177 8 01/05/2024
2.1.0.176 15 01/05/2024
2.1.0.175 13 12/26/2023
2.1.0.174 10 01/05/2024
2.1.0.173 12 01/05/2024
2.1.0.172 13 01/05/2024
2.1.0.171 12 01/05/2024
2.1.0.170 12 01/05/2024
2.1.0.169 13 01/05/2024
2.1.0.168 9 01/05/2024
2.1.0.166 13 01/05/2024
2.1.0.164 13 11/17/2023
2.1.0.163 14 12/27/2023
2.1.0.159 8 01/05/2024
2.0.0.144 11 01/05/2024
2.0.0.143 14 01/05/2024
2.0.0.142 9 11/19/2023
2.0.0.141 8 01/05/2024
2.0.0.140 8 01/05/2024
2.0.0.139 7 01/05/2024
2.0.0.138 11 01/05/2024
2.0.0.137 12 01/05/2024
2.0.0.136 10 01/05/2024
2.0.0.124 12 11/29/2023
2.0.0.123 11 01/05/2024
2.0.0.122 9 01/05/2024
2.0.0.121 11 01/05/2024
2.0.0.120 11 01/05/2024
2.0.0.119 9 01/05/2024
2.0.0.118 9 01/05/2024
2.0.0.117 10 01/05/2024
2.0.0.116 9 01/05/2024
2.0.0.115 10 01/05/2024
2.0.0.114 9 11/22/2023
2.0.0.113 14 01/05/2024
2.0.0.112 12 01/05/2024
2.0.0.111 10 01/05/2024
2.0.0.110 10 01/05/2024
2.0.0.109 11 12/17/2023
2.0.0.108 11 01/05/2024
2.0.0.107 14 12/07/2023
2.0.0.106 11 10/29/2023
2.0.0.105 12 01/05/2024
2.0.0.104 9 01/05/2024
2.0.0.103 13 11/25/2023
2.0.0.102 13 01/09/2024
2.0.0.101 11 01/05/2024
2.0.0.100 13 01/05/2024
2.0.0.99 10 01/04/2024
2.0.0.98 12 11/26/2023
1.4.0.93 11 01/05/2024
1.4.0.92 16 10/19/2023
1.4.0.89 8 01/05/2024
1.4.0.88 13 01/05/2024
1.4.0.87 15 12/15/2023
1.4.0.86 13 01/05/2024
1.4.0.85 12 01/05/2024
1.4.0.84 10 01/05/2024
1.4.0.83 10 01/05/2024
1.4.0.82 14 01/05/2024
1.4.0.81 12 01/01/2024
1.4.0.80 12 11/27/2023
1.4.0.79 11 01/05/2024
1.4.0.78 13 01/05/2024
1.4.0.77 13 09/14/2023
1.4.0.76 15 12/31/2023
1.4.0.75 15 12/28/2023
1.4.0.74 14 10/22/2023
1.4.0.73 10 01/05/2024
1.4.0.72 13 12/13/2023
1.4.0.71 11 01/05/2024
1.4.0.70 12 01/05/2024
1.4.0.69 15 01/05/2024
1.4.0.68 11 01/03/2024
1.4.0.67 11 01/05/2024
1.4.0.66 11 12/08/2023
1.4.0.65 11 10/15/2023
1.4.0.64 15 12/15/2023
1.4.0.63 12 01/02/2024
1.4.0.62 10 01/05/2024
1.4.0.61 12 11/14/2023
1.4.0.60 13 01/03/2024
1.4.0.59 11 01/05/2024
1.4.0.58 12 01/05/2024
1.4.0.57 11 01/05/2024
1.4.0.56 13 01/05/2024
1.4.0.55 11 12/25/2023
1.4.0.54 12 01/05/2024
1.4.0.53 13 11/18/2023
1.4.0.52 13 10/24/2023
1.4.0.51 11 12/24/2023
1.4.0.50 20 11/16/2023
1.4.0.49 14 01/05/2024
1.4.0.48 14 10/21/2023
1.4.0.47 11 11/17/2023
1.4.0.46 9 01/04/2024
1.4.0.45 12 10/29/2023
1.4.0.44 10 01/05/2024
1.4.0.43 12 01/05/2024
1.4.0.42 10 01/05/2024
1.4.0.41 12 10/15/2023
1.4.0.40 10 01/05/2024
1.4.0.39 10 01/04/2024
1.4.0.38 10 01/05/2024
1.4.0.37 8 01/05/2024
1.4.0.36 11 11/04/2023
1.4.0.35 11 12/31/2023
1.4.0.34 10 01/04/2024
1.4.0.33 9 01/05/2024
1.4.0.32 16 10/18/2023
1.4.0.31 12 01/05/2024
1.4.0.30 14 12/28/2023
1.4.0.29 11 01/05/2024
1.4.0.28 11 10/12/2023
1.4.0.27 17 01/05/2024
1.4.0.26 13 11/26/2023
1.4.0.25 11 01/05/2024
1.4.0.24 16 01/05/2024
1.4.0.23 13 11/03/2023
1.4.0.22 11 01/05/2024
1.4.0.21 9 01/05/2024
1.4.0.20 14 10/13/2023
1.4.0.19 12 01/05/2024
1.4.0.18 13 01/05/2024
1.4.0.17 15 09/24/2023
1.4.0.14 15 01/05/2024
1.4.0.13 11 01/05/2024
1.4.0.12 12 11/18/2023
1.4.0.11 11 01/05/2024
1.3.0 12 11/28/2023
1.2.0 11 12/11/2023