diff --git a/src/System.IO.Abstractions/IDirectoryInfoExtensions.cs b/src/System.IO.Abstractions/IDirectoryInfoExtensions.cs
new file mode 100644
index 000000000..ffc5a43cb
--- /dev/null
+++ b/src/System.IO.Abstractions/IDirectoryInfoExtensions.cs
@@ -0,0 +1,27 @@
+namespace System.IO.Abstractions
+{
+ public static class IDirectoryInfoExtensions
+ {
+ ///
+ /// Get an for the specified sub-directory
+ ///
+ ///
+ /// Sub-directory name (ex. "test")
+ /// An for the specified sub-directory
+ public static IDirectoryInfo SubDirectory(this IDirectoryInfo info, string name)
+ {
+ return info.FileSystem.DirectoryInfo.FromDirectoryName(info.FileSystem.Path.Combine(info.FullName, name));
+ }
+
+ ///
+ /// Get an for the specified file
+ ///
+ ///
+ /// File name (ex. "test.txt")
+ /// An for the specified file
+ public static IFileInfo File(this IDirectoryInfo info, string name)
+ {
+ return info.FileSystem.FileInfo.FromFileName(info.FileSystem.Path.Combine(info.FullName, name));
+ }
+ }
+}
diff --git a/tests/System.IO.Abstractions.Tests/DirectoryInfoExtensionsTests.cs b/tests/System.IO.Abstractions.Tests/DirectoryInfoExtensionsTests.cs
new file mode 100644
index 000000000..c58bf845d
--- /dev/null
+++ b/tests/System.IO.Abstractions.Tests/DirectoryInfoExtensionsTests.cs
@@ -0,0 +1,61 @@
+using NUnit.Framework;
+
+namespace System.IO.Abstractions.Tests
+{
+ [TestFixture]
+ public class DirectoryInfoExtensionsTests
+ {
+ [Test]
+ public void SubDirectory_Extension_Test()
+ {
+ //arrange
+ var fs = new FileSystem();
+ var current = fs.DirectoryInfo.FromDirectoryName(fs.Directory.GetCurrentDirectory());
+ var guid = Guid.NewGuid().ToString();
+ var expectedPath = fs.Path.Combine(current.FullName, guid);
+
+ //make sure directory doesn't exists
+ Assert.IsFalse(fs.Directory.Exists(expectedPath));
+
+ //create directory
+ var created = current.SubDirectory(guid);
+ created.Create();
+
+ //assert it exists
+ Assert.IsTrue(fs.Directory.Exists(expectedPath));
+ Assert.AreEqual(expectedPath, created.FullName);
+
+ //delete directory
+ created.Delete();
+ Assert.IsFalse(fs.Directory.Exists(expectedPath));
+ }
+
+ [Test]
+ public void File_Extension_Test()
+ {
+ //arrange
+ var fs = new FileSystem();
+ var current = fs.DirectoryInfo.FromDirectoryName(fs.Directory.GetCurrentDirectory());
+ var guid = Guid.NewGuid().ToString();
+ var expectedPath = fs.Path.Combine(current.FullName, guid);
+
+ //make sure file doesn't exists
+ Assert.IsFalse(fs.File.Exists(expectedPath));
+
+ //create file
+ var created = current.File(guid);
+ using (var stream = created.Create())
+ {
+ stream.Dispose();
+ }
+
+ //assert it exists
+ Assert.IsTrue(fs.File.Exists(expectedPath));
+ Assert.AreEqual(expectedPath, created.FullName);
+
+ //delete file
+ created.Delete();
+ Assert.IsFalse(fs.File.Exists(expectedPath));
+ }
+ }
+}