From 429423c07f7255d3bd359dec210f32e64e039049 Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 8 Jan 2019 12:52:16 +0100 Subject: [PATCH] Unwrap wrapped filesystems --- src/Umbraco.Core/IO/FileSystemExtensions.cs | 28 +++++++++++++++++++++ src/Umbraco.Core/IO/FileSystemWrapper.cs | 2 +- src/Umbraco.Core/IO/ShadowWrapper.cs | 2 ++ src/Umbraco.Tests/IO/FileSystemsTests.cs | 10 ++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) 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() {