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
}
}