diff --git a/src/Umbraco.Core/IO/FileSystemExtensions.cs b/src/Umbraco.Core/IO/FileSystemExtensions.cs
index 4b73e64e80..ade2c58b38 100644
--- a/src/Umbraco.Core/IO/FileSystemExtensions.cs
+++ b/src/Umbraco.Core/IO/FileSystemExtensions.cs
@@ -65,5 +65,33 @@ namespace Umbraco.Core.IO
}
fs.DeleteFile(tempFile);
}
+
+ ///
+ /// Unwraps a filesystem.
+ ///
+ ///
+ /// A filesystem can be wrapped in a (public) or a (internal),
+ /// and this method deals with the various wrappers and
+ ///
+ public static IFileSystem Unwrap(this IFileSystem filesystem)
+ {
+ var unwrapping = true;
+ while (unwrapping)
+ {
+ switch (filesystem)
+ {
+ case FileSystemWrapper wrapper:
+ filesystem = wrapper.InnerFileSystem;
+ break;
+ case ShadowWrapper shadow:
+ filesystem = shadow.InnerFileSystem;
+ break;
+ default:
+ unwrapping = false;
+ break;
+ }
+ }
+ return filesystem;
+ }
}
}
diff --git a/src/Umbraco.Core/IO/FileSystemWrapper.cs b/src/Umbraco.Core/IO/FileSystemWrapper.cs
index a493b7166b..14d028c16d 100644
--- a/src/Umbraco.Core/IO/FileSystemWrapper.cs
+++ b/src/Umbraco.Core/IO/FileSystemWrapper.cs
@@ -21,7 +21,7 @@ namespace Umbraco.Core.IO
InnerFileSystem = innerFileSystem;
}
- public IFileSystem InnerFileSystem { get; internal set; }
+ internal IFileSystem InnerFileSystem { get; set; }
public IEnumerable GetDirectories(string path)
{
diff --git a/src/Umbraco.Core/IO/ShadowWrapper.cs b/src/Umbraco.Core/IO/ShadowWrapper.cs
index 94bd61b162..6493238391 100644
--- a/src/Umbraco.Core/IO/ShadowWrapper.cs
+++ b/src/Umbraco.Core/IO/ShadowWrapper.cs
@@ -75,6 +75,8 @@ namespace Umbraco.Core.IO
}
}
+ public IFileSystem InnerFileSystem => _innerFileSystem;
+
private IFileSystem FileSystem
{
get
diff --git a/src/Umbraco.Tests/IO/FileSystemsTests.cs b/src/Umbraco.Tests/IO/FileSystemsTests.cs
index d1aeb1a3fa..52de1bbcfa 100644
--- a/src/Umbraco.Tests/IO/FileSystemsTests.cs
+++ b/src/Umbraco.Tests/IO/FileSystemsTests.cs
@@ -86,6 +86,16 @@ namespace Umbraco.Tests.IO
Assert.AreSame(fileSystem1, fileSystem2);
}
+ [Test]
+ public void Can_Unwrap_MediaFileSystem()
+ {
+ var fileSystem = _factory.GetInstance();
+ var unwrapped = fileSystem.Unwrap();
+ Assert.IsNotNull(unwrapped);
+ var physical = unwrapped as PhysicalFileSystem;
+ Assert.IsNotNull(physical);
+ }
+
[Test]
public void Can_Delete_MediaFiles()
{