System.IO.Abstractions 19.2.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

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.AreEqual("We can't go on together. It's not me, it's you.", ex.Message);
        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.
50
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
46
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
44
Glob.cs
File system path globbing
42
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
41
Glob.cs
File system path globbing
41
System.IO.Abstractions.TestingHelpers
A set of pre-built mocks to help when testing file system interactions.
39
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
38
Glob.cs
File system path globbing library (wildcards like in bash). Supports netstandard1.4, netstandard2.0, and net40.
38
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
37
System.IO.Abstractions.TestingHelpers
A set of pre-built mocks to help when testing file system interactions.
37
Glob.cs
File system path globbing library (wildcards like in bash).
37
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
36

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