System.IO.Abstractions 22.0.15

System.IO.Abstractions NuGet Build Quality Gate Status Coverage 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.
57
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
55
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
53
Glob.cs
File system path globbing
51
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
50
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
49
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
48
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
47
Glob.cs
File system path globbing
47
Glob.cs
File system path globbing library (wildcards like in bash). Supports netstandard1.4, netstandard2.0, and net40.
47
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
46
System.IO.Abstractions.TestingHelpers
A set of pre-built mocks to help when testing file system interactions.
46
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
45
Glob.cs
File system path globbing library (wildcards like in bash).
45
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
44

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