| File: Mount\FileSystem\FileSystemDirectory.cs | Web Access |
| Project: src\sdk\src\TemplateEngine\Microsoft.TemplateEngine.Edge\Microsoft.TemplateEngine.Edge.csproj (Microsoft.TemplateEngine.Edge) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.TemplateEngine.Abstractions.Mount; using Microsoft.TemplateEngine.Abstractions.PhysicalFileSystem; using Microsoft.TemplateEngine.Edge.Settings; namespace Microsoft.TemplateEngine.Edge.Mount.FileSystem { internal class FileSystemDirectory : DirectoryBase { private readonly string _physicalPath; private readonly SettingsFilePaths _paths; private readonly IPhysicalFileSystem _fileSystem; internal FileSystemDirectory(IMountPoint mountPoint, string fullPath, string name, string physicalPath) : base(mountPoint, EnsureTrailingSlash(fullPath), name) { _physicalPath = physicalPath; _paths = new SettingsFilePaths(mountPoint.EnvironmentSettings); _fileSystem = mountPoint.EnvironmentSettings.Host.FileSystem; } public override bool Exists => _fileSystem.DirectoryExists(_physicalPath); public override IEnumerable<IFileSystemInfo> EnumerateFileSystemInfos(string pattern, SearchOption searchOption) { return _paths.EnumerateFileSystemEntries(_physicalPath, pattern, searchOption).Select(x => { if (MountPoint is not FileSystemMountPoint fileSystemMountPoint) { throw new NotSupportedException($"{nameof(FileSystemDirectory)} may only exist in {nameof(FileSystemMountPoint)} mount point."); } string baseName = x.Substring(fileSystemMountPoint.MountPointRootPath.Length).Replace(Path.DirectorySeparatorChar, '/'); if (baseName.Length == 0) { baseName = "/"; } if (baseName[0] != '/') { baseName = "/" + baseName; } if (_fileSystem.DirectoryExists(x) && baseName[baseName.Length - 1] != '/') { baseName += "/"; } return fileSystemMountPoint.FileSystemInfo(baseName); }); } public override IEnumerable<IDirectory> EnumerateDirectories(string pattern, SearchOption searchOption) { return _paths.EnumerateDirectories(_physicalPath, pattern, searchOption).Select(x => { string baseName = x.Substring(((FileSystemMountPoint)MountPoint).MountPointRootPath.Length).Replace(Path.DirectorySeparatorChar, '/'); if (baseName.Length == 0) { baseName = "/"; } if (baseName[0] != '/') { baseName = "/" + baseName; } if (baseName[baseName.Length - 1] != '/') { baseName += "/"; } return new FileSystemDirectory(MountPoint, baseName, _paths.Name(x), x); }); } public override IEnumerable<IFile> EnumerateFiles(string pattern, SearchOption searchOption) { return _paths.EnumerateFiles(_physicalPath, pattern, searchOption).Select(x => { string baseName = x.Substring(((FileSystemMountPoint)MountPoint).MountPointRootPath.Length).Replace(Path.DirectorySeparatorChar, '/'); if (baseName.Length == 0) { baseName = "/"; } if (baseName[0] != '/') { baseName = "/" + baseName; } return new FileSystemFile(MountPoint, baseName, _paths.Name(x), x); }); } private static string EnsureTrailingSlash(string path) { if (path.Last() == '/') { return path; } else { return path + "/"; } } } }