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.
64
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
63
Glob.cs
File system path globbing
60
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
59
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
57
System.IO.Abstractions.TestingHelpers
A set of pre-built mocks to help when testing file system interactions.
56
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
55
Glob.cs
File system path globbing library (wildcards like in bash). Supports netstandard1.4, netstandard2.0, and net40.
55
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
54
Glob.cs
File system path globbing
54
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
53
System.IO.Abstractions.TestingHelpers
A set of pre-built mocks to help when testing file system interactions.
53
Glob.cs
File system path globbing library (wildcards like in bash).
53
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
52

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