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

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