System.IO.Abstractions 20.0.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.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.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.
21
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
22
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
23
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
24
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
27
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
29
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
33

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