using System; using System.Collections.Generic; using System.Linq; using ICD.Common.Properties; using ICD.Common.Services; using ICD.Common.Services.Logging; using ICD.Common.Utils.Extensions; using ICD.Common.Utils.IO; namespace ICD.Common.Utils { /// /// Provides util methods for working with file/directory paths. /// public static class PathUtils { #region Properties /// /// Gets the path to the root directory of the processor. /// [PublicAPI] public static string RootPath { get { return IcdDirectory.GetDirectoryRoot("\\"); } } /// /// Gets the path to the NVRAM directory. /// [PublicAPI] public static string NvramPath { get { return Join(RootPath, "NVRAM"); } } /// /// Returns the absolute path to the configuration directory. /// /// [PublicAPI] public static string ProgramConfigPath { get { string directoryName = string.Format("Program{0:D2}Config", ProgramUtils.ProgramNumber); return Join(NvramPath, directoryName); } } /// /// Returns the absolute path to the common configuration directory. /// [PublicAPI] public static string CommonConfigPath { get { return Join(NvramPath, "CommonConfig"); } } /// /// Returns the absolute path to the common config library directory. /// [PublicAPI] public static string CommonLibPath { get { return Join(CommonConfigPath, "Lib"); } } /// /// Returns the absolute path to the program config library directory. /// [PublicAPI] public static string ProgramLibPath { get { return Join(ProgramConfigPath, "Lib"); } } #endregion #region Methods /// /// Creates a path from the given path nodes. /// /// /// public static string Join(params string[] items) { try { return items.Skip(1).Aggregate(items.First(), IcdPath.Combine); } catch (ArgumentException e) { throw new ArgumentException("Failed to join path: " + StringUtils.ArrayFormat(items), e); } } /// /// Gets the full path for the given path. /// /// /// public static string GetFullPath(string path) { return Join(IcdDirectory.GetApplicationDirectory(), path); } /// /// Replaces the filename while leaving the directory and extension intact. /// /// /// /// public static string ChangeFilenameWithoutExt(string path, string newName) { string dir = IcdPath.GetDirectoryName(path); string ext = IcdPath.GetExtension(path); return Join(dir, newName + ext); } /// /// Removes the extension from the given path. /// /// /// public static string GetPathWithoutExtension(string path) { string dir = IcdPath.GetDirectoryName(path); string filename = IcdPath.GetFileNameWithoutExtension(path); return Join(dir, filename); } /// /// Recurses over the file paths at the given directory. /// /// /// public static IEnumerable RecurseFilePaths(string path) { if (!IcdDirectory.Exists(path)) yield break; Queue queue = new Queue(); queue.Enqueue(path); while (queue.Count > 0) { path = queue.Dequeue(); // Get the subdirectories try { foreach (string subDir in IcdDirectory.GetDirectories(path)) queue.Enqueue(subDir); } catch (Exception e) { ServiceProvider.TryGetService().AddEntry(eSeverity.Error, e, e.Message); } // Get the files string[] files; try { files = IcdDirectory.GetFiles(path); } catch (Exception e) { ServiceProvider.TryGetService().AddEntry(eSeverity.Error, e, e.Message); continue; } foreach (string filePath in files) yield return filePath; } } /// /// Searches the program config path, common config path, and application path to /// find the first config that exists with the given local path. /// /// /// public static string GetDefaultConfigPath(params string[] localPath) { string local = Join(localPath); // Program slot configuration string programPath = Join(ProgramConfigPath, local); if (PathExists(programPath)) return programPath; // Common program configuration string commonPath = Join(CommonConfigPath, local); return PathExists(commonPath) ? commonPath : Join(IcdDirectory.GetApplicationDirectory(), local); // Installation defaults } /// /// Appends the local path to the program config path. /// /// public static string GetProgramConfigPath(params string[] localPath) { string local = Join(localPath); return Join(ProgramConfigPath, local); } /// /// Searches the application path, program config path and common config path to /// find the first IR driver that exists with the given local path. /// /// /// public static string GetIrDriversPath(params string[] localPath) { return GetDefaultConfigPath(localPath.Prepend("IRDrivers").ToArray()); } /// /// Searches the application path, program config path and common config path to /// find the first SSL Driver that exists with the given local path. /// /// /// public static string GetSslCertificatesPath(params string[] localPath) { return GetDefaultConfigPath(localPath.Prepend("SSLCertificates").ToArray()); } /// /// Returns true if the given path exists. /// /// /// public static bool PathExists(string path) { return IcdFile.Exists(path) || IcdDirectory.Exists(path); } #endregion } }