diff --git a/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/DictionaryBasedFileProvider.cs b/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/DictionaryBasedFileProvider.cs new file mode 100644 index 0000000000..6ab9b36a96 --- /dev/null +++ b/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/DictionaryBasedFileProvider.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Primitives; + +namespace Volo.Abp.VirtualFileSystem +{ + public abstract class DictionaryBasedFileProvider : IFileProvider + { + protected abstract Dictionary Files { get; } + + public virtual IFileInfo GetFileInfo(string subpath) + { + if (string.IsNullOrEmpty(subpath)) + { + return new NotFoundFileInfo(subpath); + } + + var file = Files.GetOrDefault(VirtualFilePathHelper.NormalizePath(subpath)); + + if (file == null) + { + return new NotFoundFileInfo(subpath); + } + + return file; + } + + public virtual IDirectoryContents GetDirectoryContents(string subpath) + { + var directory = GetFileInfo(subpath); + if (!directory.IsDirectory) + { + return new NotFoundDirectoryContents(); + } + + var fileList = new List(); + + var directoryPath = subpath.EnsureEndsWith('/'); + foreach (var fileInfo in Files.Values) + { + if (!fileInfo.PhysicalPath.StartsWith(directoryPath)) + { + continue; + } + + var relativePath = fileInfo.PhysicalPath.Substring(directoryPath.Length); + if (relativePath.Contains("/")) + { + continue; + } + + fileList.Add(fileInfo); + } + + return new EnumerableDirectoryContents(fileList); + } + + public virtual IChangeToken Watch(string filter) + { + return NullChangeToken.Singleton; + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs b/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs index 750ab29b15..dd23a8c5e5 100644 --- a/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs +++ b/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs @@ -54,8 +54,10 @@ namespace Volo.Abp.VirtualFileSystem return fileProvider; } - protected class InternalVirtualFileProvider : IFileProvider + protected class InternalVirtualFileProvider : DictionaryBasedFileProvider { + protected override Dictionary Files => _files.Value; + private readonly VirtualFileSystemOptions _options; private readonly Lazy> _files; @@ -63,64 +65,12 @@ namespace Volo.Abp.VirtualFileSystem { _options = options; _files = new Lazy>( - CreateResourcesDictionary, + CreateFiles, true ); } - - public IFileInfo GetFileInfo(string subpath) - { - if (string.IsNullOrEmpty(subpath)) - { - return new NotFoundFileInfo(subpath); - } - - var file = _files.Value.GetOrDefault(VirtualFilePathHelper.NormalizePath(subpath)); - - if (file == null) - { - return new NotFoundFileInfo(subpath); - } - - return file; - } - - public IDirectoryContents GetDirectoryContents(string subpath) - { - var directory = GetFileInfo(subpath); - if (!directory.IsDirectory) - { - return new NotFoundDirectoryContents(); - } - - var fileList = new List(); - - var directoryPath = subpath.EnsureEndsWith('/'); - foreach (var fileInfo in _files.Value.Values) - { - if (!fileInfo.PhysicalPath.StartsWith(directoryPath)) - { - continue; - } - - var relativePath = fileInfo.PhysicalPath.Substring(directoryPath.Length); - if (relativePath.Contains("/")) - { - continue; - } - - fileList.Add(fileInfo); - } - - return new EnumerableDirectoryContents(fileList); - } - - public IChangeToken Watch(string filter) - { - return NullChangeToken.Singleton; - } - - private Dictionary CreateResourcesDictionary() + + private Dictionary CreateFiles() { var files = new Dictionary(StringComparer.OrdinalIgnoreCase);