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

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