System.IO.Abstractions 17.0.14
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.
dotnet add package System.IO.Abstractions
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.");
}
}
}
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 System.IO.Abstractions.TestingHelpers
[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();
...
}
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.
|
3 |
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
|
4 |
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
|
5 |
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
|
6 |
KubernetesClient
Client library for the Kubernetes open source container orchestrator.
|
7 |
.NET Framework 4.6.1
- No dependencies.
.NET 5.0
- System.IO.FileSystem.AccessControl (>= 5.0.0)
.NET 6.0
- No dependencies.
.NET Standard 2.0
- System.IO.FileSystem.AccessControl (>= 4.7.0)
.NET Standard 2.1
- System.IO.FileSystem.AccessControl (>= 4.7.0)
Version | Downloads | Last updated |
---|---|---|
21.1.3 | 1 | 11/12/2024 |
21.1.2 | 0 | 11/08/2024 |
21.1.1 | 0 | 11/07/2024 |
21.0.29 | 0 | 07/25/2024 |
21.0.26 | 0 | 07/13/2024 |
21.0.22 | 0 | 06/22/2024 |
21.0.2 | 5 | 05/18/2024 |
20.0.34 | 4 | 05/15/2024 |
20.0.28 | 3 | 05/23/2024 |
20.0.15 | 7 | 04/10/2024 |
20.0.4 | 4 | 12/20/2023 |
20.0.1 | 9 | 04/09/2024 |
19.2.91 | 3 | 05/25/2024 |
19.2.87 | 2 | 05/23/2024 |
19.2.69 | 5 | 05/15/2024 |
19.2.67 | 2 | 05/19/2024 |
19.2.66 | 4 | 05/11/2024 |
19.2.64 | 2 | 05/25/2024 |
19.2.63 | 3 | 05/03/2024 |
19.2.61 | 3 | 05/24/2024 |
19.2.51 | 5 | 05/25/2024 |
19.2.50 | 3 | 05/25/2024 |
19.2.29 | 4 | 05/08/2024 |
19.2.26 | 3 | 05/25/2024 |
19.2.25 | 3 | 05/07/2024 |
19.2.22 | 3 | 05/09/2024 |
19.2.18 | 4 | 05/13/2024 |
19.2.17 | 4 | 05/25/2024 |
19.2.16 | 3 | 05/10/2024 |
19.2.15 | 3 | 05/22/2024 |
19.2.13 | 4 | 05/25/2024 |
19.2.12 | 4 | 05/11/2024 |
19.2.11 | 5 | 05/15/2024 |
19.2.9 | 3 | 05/21/2024 |
19.2.8 | 4 | 04/30/2024 |
19.2.4 | 3 | 05/17/2024 |
19.2.1 | 5 | 05/09/2024 |
19.1.18 | 4 | 05/06/2024 |
19.1.14 | 5 | 05/04/2024 |
19.1.13 | 2 | 05/25/2024 |
19.1.5 | 6 | 05/19/2024 |
19.1.1 | 4 | 05/02/2024 |
19.0.1 | 7 | 05/19/2024 |
18.0.1 | 4 | 04/22/2024 |
17.2.26 | 4 | 05/11/2024 |
17.2.3 | 3 | 05/25/2024 |
17.2.1 | 4 | 04/09/2024 |
17.1.1 | 2 | 05/25/2024 |
17.0.28 | 12 | 04/09/2024 |
17.0.24 | 4 | 05/25/2024 |
17.0.23 | 4 | 05/02/2024 |
17.0.21 | 2 | 05/25/2024 |
17.0.18 | 2 | 05/24/2024 |
17.0.15 | 4 | 05/06/2024 |
17.0.14 | 3 | 05/25/2024 |
17.0.13 | 3 | 05/24/2024 |
17.0.12 | 4 | 05/25/2024 |
17.0.11 | 3 | 05/25/2024 |
17.0.10 | 3 | 05/02/2024 |
17.0.9 | 7 | 05/23/2024 |
17.0.8 | 2 | 05/16/2024 |
17.0.7 | 3 | 05/24/2024 |
17.0.6 | 3 | 05/09/2024 |
17.0.5 | 1 | 05/25/2024 |
17.0.4 | 6 | 05/15/2024 |
17.0.3 | 4 | 05/05/2024 |
17.0.2 | 4 | 05/25/2024 |
17.0.1 | 4 | 05/25/2024 |
16.1.26 | 2 | 05/25/2024 |
16.1.22 | 2 | 05/25/2024 |
16.1.18 | 4 | 05/14/2024 |
16.1.16 | 3 | 05/01/2024 |
16.1.13 | 3 | 05/03/2024 |
16.1.12 | 4 | 05/07/2024 |
16.1.9 | 2 | 05/22/2024 |
16.1.4 | 3 | 05/23/2024 |
16.0.8 | 3 | 05/06/2024 |
16.0.7 | 3 | 05/13/2024 |
16.0.6 | 5 | 05/13/2024 |
16.0.5 | 6 | 05/19/2024 |
16.0.4 | 3 | 05/02/2024 |
16.0.3 | 7 | 05/15/2024 |
16.0.2 | 4 | 05/10/2024 |
16.0.1 | 3 | 05/21/2024 |
15.0.1 | 4 | 05/20/2024 |
14.0.13 | 3 | 05/06/2024 |
14.0.12 | 4 | 05/06/2024 |
14.0.11 | 4 | 05/10/2024 |
14.0.10 | 6 | 05/14/2024 |
14.0.9 | 4 | 05/11/2024 |
14.0.7 | 3 | 05/25/2024 |
14.0.6 | 3 | 05/10/2024 |
14.0.5 | 3 | 05/24/2024 |
14.0.4 | 4 | 05/25/2024 |
14.0.3 | 3 | 05/21/2024 |
13.2.32 | 2 | 05/25/2024 |
13.2.31 | 4 | 05/19/2024 |
13.2.9 | 5 | 05/09/2024 |
13.2.7 | 5 | 05/05/2024 |
13.2.5 | 3 | 05/08/2024 |
13.2.4 | 3 | 05/06/2024 |
13.2.3 | 6 | 05/16/2024 |
13.0.1 | 3 | 05/14/2024 |
12.2.26 | 2 | 05/25/2024 |
12.2.25 | 3 | 05/25/2024 |
12.2.7 | 4 | 05/25/2024 |
12.2.4 | 4 | 04/30/2024 |
12.2.1 | 3 | 05/25/2024 |
12.1.11 | 8 | 05/08/2024 |
12.1.2 | 3 | 05/07/2024 |
12.0.7 | 3 | 05/16/2024 |
12.0.2 | 2 | 05/25/2024 |
11.0.18 | 4 | 05/25/2024 |
11.0.17 | 4 | 05/25/2024 |
11.0.16 | 4 | 05/18/2024 |
11.0.13 | 3 | 05/31/2024 |
11.0.11 | 3 | 05/03/2024 |
11.0.9 | 3 | 05/10/2024 |
11.0.7 | 5 | 04/26/2022 |
11.0.5 | 2 | 05/25/2024 |
11.0.4 | 4 | 04/26/2022 |
11.0.2 | 3 | 05/19/2024 |
10.0.9 | 2 | 05/22/2024 |
10.0.8 | 4 | 05/01/2024 |
10.0.6 | 2 | 05/13/2024 |
10.0.5 | 4 | 05/01/2024 |
10.0.4 | 3 | 05/25/2024 |
9.0.6 | 5 | 05/18/2024 |
9.0.4 | 6 | 05/14/2024 |
9.0.3 | 4 | 05/25/2024 |
9.0.2 | 5 | 05/09/2024 |
8.1.1 | 5 | 05/23/2024 |
8.0.3 | 4 | 05/22/2024 |
7.1.4 | 7 | 05/23/2024 |
7.1.1 | 3 | 05/11/2024 |
7.0.15 | 3 | 05/21/2024 |
6.0.36 | 4 | 05/13/2024 |
6.0.34 | 6 | 05/07/2024 |
6.0.27 | 3 | 05/09/2024 |
6.0.25 | 3 | 05/25/2024 |
6.0.23 | 3 | 05/01/2024 |
6.0.21 | 4 | 05/02/2024 |
6.0.17 | 5 | 05/21/2024 |
6.0.14 | 2 | 05/25/2024 |
6.0.13 | 4 | 05/04/2024 |
6.0.7 | 3 | 05/25/2024 |
6.0.6 | 4 | 05/13/2024 |
6.0.5 | 5 | 05/19/2024 |
6.0.3 | 4 | 05/15/2024 |
6.0.1 | 7 | 04/26/2022 |
4.2.15 | 2 | 05/25/2024 |
4.2.12 | 5 | 05/08/2024 |
4.2.9 | 5 | 05/22/2024 |
4.2.8 | 5 | 05/14/2024 |
4.1.6 | 4 | 05/10/2024 |
3.1.1 | 3 | 05/25/2024 |
3.0.2 | 4 | 05/25/2024 |
2.2.10-beta | 4 | 04/23/2024 |
2.2.9-beta | 5 | 05/02/2024 |
2.2.4-beta | 3 | 05/17/2024 |
2.2.2-beta | 6 | 04/24/2024 |
2.1.0.247 | 5 | 05/25/2024 |
2.1.0.237 | 1 | 05/25/2024 |
2.1.0.236 | 4 | 05/25/2024 |
2.1.0.235 | 2 | 05/25/2024 |
2.1.0.234 | 1 | 05/25/2024 |
2.1.0.231 | 3 | 05/25/2024 |
2.1.0.230 | 2 | 05/03/2024 |
2.1.0.229 | 2 | 05/25/2024 |
2.1.0.227 | 2 | 05/25/2024 |
2.1.0.226 | 3 | 05/04/2024 |
2.1.0.217 | 2 | 05/02/2024 |
2.1.0.216 | 3 | 05/11/2024 |
2.1.0.215 | 3 | 05/20/2024 |
2.1.0.214 | 2 | 05/25/2024 |
2.1.0.213 | 3 | 05/25/2024 |
2.1.0.211 | 2 | 05/25/2024 |
2.1.0.210 | 3 | 05/06/2024 |
2.1.0.209 | 3 | 05/11/2024 |
2.1.0.208 | 3 | 05/07/2024 |
2.1.0.207 | 2 | 05/25/2024 |
2.1.0.206 | 2 | 05/25/2024 |
2.1.0.204 | 4 | 05/25/2024 |
2.1.0.203 | 2 | 05/04/2024 |
2.1.0.202 | 3 | 05/25/2024 |
2.1.0.201 | 1 | 05/25/2024 |
2.1.0.193 | 3 | 05/14/2024 |
2.1.0.189 | 4 | 04/26/2022 |
2.1.0.187 | 5 | 05/07/2024 |
2.1.0.186 | 2 | 05/25/2024 |
2.1.0.184 | 3 | 05/25/2024 |
2.1.0.183 | 3 | 05/11/2024 |
2.1.0.182 | 4 | 05/25/2024 |
2.1.0.181 | 1 | 05/25/2024 |
2.1.0.180 | 5 | 05/25/2024 |
2.1.0.179 | 3 | 05/08/2024 |
2.1.0.178 | 3 | 05/06/2024 |
2.1.0.177 | 5 | 05/02/2024 |
2.1.0.176 | 3 | 05/25/2024 |
2.1.0.175 | 3 | 05/16/2024 |
2.1.0.174 | 4 | 05/09/2024 |
2.1.0.173 | 3 | 04/26/2022 |
2.1.0.171 | 1 | 05/25/2024 |
2.1.0.170 | 4 | 05/25/2024 |
2.1.0.168 | 4 | 05/02/2024 |
2.1.0.164 | 5 | 05/02/2024 |
2.1.0.159 | 3 | 05/25/2024 |
2.0.0.144 | 4 | 05/04/2024 |
2.0.0.143 | 3 | 05/25/2024 |
2.0.0.142 | 2 | 05/25/2024 |
2.0.0.141 | 4 | 05/09/2024 |
2.0.0.140 | 5 | 05/19/2024 |
2.0.0.139 | 2 | 05/25/2024 |
2.0.0.138 | 1 | 05/25/2024 |
2.0.0.136 | 2 | 05/25/2024 |
2.0.0.124 | 11 | 04/09/2024 |
2.0.0.120 | 3 | 05/16/2024 |
2.0.0.119 | 5 | 05/21/2024 |
2.0.0.118 | 3 | 05/24/2024 |
2.0.0.117 | 4 | 05/25/2024 |
2.0.0.115 | 2 | 05/25/2024 |
2.0.0.113 | 4 | 05/25/2024 |
2.0.0.111 | 4 | 05/25/2024 |
2.0.0.110 | 5 | 04/26/2022 |
2.0.0.109 | 3 | 04/26/2022 |
2.0.0.108 | 4 | 05/25/2024 |
2.0.0.107 | 9 | 04/10/2024 |
2.0.0.106 | 3 | 05/25/2024 |
2.0.0.105 | 3 | 05/19/2024 |
2.0.0.104 | 6 | 04/26/2022 |
2.0.0.103 | 3 | 05/25/2024 |
2.0.0.102 | 2 | 05/12/2024 |
2.0.0.101 | 4 | 04/26/2022 |
2.0.0.100 | 10 | 04/09/2024 |
2.0.0.98 | 6 | 04/09/2024 |
1.4.0.93 | 5 | 05/20/2024 |
1.4.0.92 | 4 | 05/02/2024 |
1.4.0.89 | 4 | 05/25/2024 |
1.4.0.88 | 5 | 05/07/2024 |
1.4.0.87 | 4 | 05/09/2024 |
1.4.0.86 | 4 | 05/08/2024 |
1.4.0.85 | 3 | 05/01/2024 |
1.4.0.84 | 6 | 05/09/2024 |
1.4.0.83 | 5 | 05/10/2024 |
1.4.0.82 | 4 | 05/21/2024 |
1.4.0.81 | 3 | 05/21/2024 |
1.4.0.80 | 5 | 05/12/2024 |
1.4.0.79 | 3 | 05/01/2024 |
1.4.0.78 | 4 | 05/04/2024 |
1.4.0.77 | 5 | 05/25/2024 |
1.4.0.76 | 4 | 05/10/2024 |
1.4.0.75 | 5 | 05/19/2024 |
1.4.0.74 | 2 | 05/02/2024 |
1.4.0.73 | 3 | 05/25/2024 |
1.4.0.72 | 4 | 05/09/2024 |
1.4.0.71 | 3 | 05/25/2024 |
1.4.0.70 | 3 | 05/10/2024 |
1.4.0.69 | 1 | 05/25/2024 |
1.4.0.68 | 4 | 05/25/2024 |
1.4.0.67 | 2 | 05/23/2024 |
1.4.0.66 | 4 | 05/02/2024 |
1.4.0.65 | 4 | 05/25/2024 |
1.4.0.64 | 4 | 05/08/2024 |
1.4.0.63 | 5 | 05/14/2024 |
1.4.0.62 | 4 | 05/25/2024 |
1.4.0.61 | 3 | 05/07/2024 |
1.4.0.60 | 3 | 05/18/2024 |
1.4.0.59 | 3 | 05/21/2024 |
1.4.0.58 | 2 | 05/13/2024 |
1.4.0.57 | 4 | 05/18/2024 |
1.4.0.56 | 4 | 05/01/2024 |
1.4.0.55 | 3 | 05/16/2024 |
1.4.0.54 | 5 | 05/17/2024 |
1.4.0.53 | 2 | 05/11/2024 |
1.4.0.52 | 4 | 05/25/2024 |
1.4.0.51 | 4 | 05/17/2024 |
1.4.0.50 | 4 | 05/25/2024 |
1.4.0.49 | 3 | 05/25/2024 |
1.4.0.48 | 4 | 05/22/2024 |
1.4.0.47 | 6 | 05/14/2024 |
1.4.0.46 | 4 | 05/15/2024 |
1.4.0.45 | 5 | 05/06/2024 |
1.4.0.44 | 4 | 05/02/2024 |
1.4.0.43 | 3 | 05/09/2024 |
1.4.0.42 | 5 | 05/16/2024 |
1.4.0.41 | 3 | 05/07/2024 |
1.4.0.40 | 5 | 05/23/2024 |
1.4.0.39 | 4 | 05/19/2024 |
1.4.0.38 | 5 | 05/09/2024 |
1.4.0.37 | 3 | 05/25/2024 |
1.4.0.36 | 4 | 05/14/2024 |
1.4.0.35 | 4 | 05/05/2024 |
1.4.0.34 | 3 | 05/02/2024 |
1.4.0.33 | 4 | 05/23/2024 |
1.4.0.32 | 4 | 05/25/2024 |
1.4.0.31 | 2 | 05/07/2024 |
1.4.0.30 | 5 | 05/24/2024 |
1.4.0.29 | 4 | 05/25/2024 |
1.4.0.28 | 3 | 05/25/2024 |
1.4.0.27 | 3 | 05/25/2024 |
1.4.0.26 | 5 | 05/25/2024 |
1.4.0.25 | 3 | 05/15/2024 |
1.4.0.24 | 3 | 05/19/2024 |
1.4.0.23 | 4 | 05/25/2024 |
1.4.0.22 | 3 | 05/17/2024 |
1.4.0.21 | 6 | 05/24/2024 |
1.4.0.20 | 13 | 04/09/2024 |
1.4.0.19 | 3 | 05/23/2024 |
1.4.0.18 | 4 | 05/18/2024 |
1.4.0.17 | 5 | 05/06/2024 |
1.4.0.14 | 3 | 05/25/2024 |
1.4.0.12 | 4 | 05/25/2024 |
1.4.0.11 | 4 | 05/15/2024 |
1.2.0 | 3 | 05/25/2024 |