System.IO.Abstractions 21.3.1

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.
29
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
28
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
27
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
26
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
25
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
24

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