| File: PhysicalFileSystem.cs | Web Access |
| Project: src\sdk\src\TemplateEngine\Microsoft.TemplateEngine.Utils\Microsoft.TemplateEngine.Utils.csproj (Microsoft.TemplateEngine.Utils) |
// 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.PhysicalFileSystem; namespace Microsoft.TemplateEngine.Utils { /// <summary> /// Local file system implementation of <see cref="IPhysicalFileSystem"/>. /// </summary> /// <seealso cref="Abstractions.ITemplateEngineHost"/> public class PhysicalFileSystem : IPhysicalFileSystem { public bool DirectoryExists(string directory) { return Directory.Exists(directory); } public bool FileExists(string file) { return File.Exists(file); } public Stream CreateFile(string path) { return File.Create(path); } public void CreateDirectory(string path) { _ = Directory.CreateDirectory(path); } public string GetCurrentDirectory() { return Directory.GetCurrentDirectory(); } public IEnumerable<string> EnumerateFileSystemEntries(string directoryName, string pattern, SearchOption searchOption) { return Directory.EnumerateFileSystemEntries(directoryName, pattern, searchOption); } public void FileCopy(string source, string target, bool overwrite) { File.Copy(source, target, overwrite); } public void DirectoryDelete(string path, bool recursive) { Directory.Delete(path, recursive); } public string ReadAllText(string path) { return File.ReadAllText(path); } public byte[] ReadAllBytes(string path) { return File.ReadAllBytes(path); } public void WriteAllText(string path, string value) { File.WriteAllText(path, value); } public IEnumerable<string> EnumerateDirectories(string path, string pattern, SearchOption searchOption) { return Directory.EnumerateDirectories(path, pattern, searchOption); } public IEnumerable<string> EnumerateFiles(string path, string pattern, SearchOption searchOption) { return Directory.EnumerateFiles(path, pattern, searchOption); } public Stream OpenRead(string path) { return File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read); } public void FileDelete(string path) { File.Delete(path); } public FileAttributes GetFileAttributes(string file) { return File.GetAttributes(file); } public void SetFileAttributes(string file, FileAttributes attributes) { File.SetAttributes(file, attributes); } public DateTime GetLastWriteTimeUtc(string file) { return File.GetLastWriteTimeUtc(file); } public void SetLastWriteTimeUtc(string file, DateTime lastWriteTimeUtc) { File.SetLastWriteTimeUtc(file, lastWriteTimeUtc); } public string PathRelativeTo(string target, string relativeTo) { string resultPath; try { string basePath = Path.GetFullPath(relativeTo); string sourceFullPath = Path.GetFullPath(target); resultPath = PathRelativeToInternal(sourceFullPath, basePath); } catch (Exception) { resultPath = NormalizePath(target); } return resultPath; } public IDisposable WatchFileChanges(string filePath, FileSystemEventHandler fileChanged) { FileSystemWatcher watcher = new FileSystemWatcher(Path.GetDirectoryName(filePath), Path.GetFileName(filePath)); watcher.Changed += fileChanged; watcher.NotifyFilter = NotifyFilters.LastWrite; watcher.EnableRaisingEvents = true; return watcher; } internal static string PathRelativeToInternal(string target, string relativeTo) { string resultPath = target; relativeTo = relativeTo.TrimEnd('/', '\\'); if (target.StartsWith(relativeTo, StringComparison.CurrentCulture)) { resultPath = target.Substring(relativeTo.Length + 1); } return NormalizePath(resultPath); } private static string NormalizePath(string path) { char desiredDirectorySeparator = Path.DirectorySeparatorChar; char undesiredSeparatorChar = desiredDirectorySeparator switch { '/' => '\\', '\\' => '/', _ => desiredDirectorySeparator, }; return path.Replace(undesiredSeparatorChar, desiredDirectorySeparator); } } }