using System; using System.IO; using System.Linq; using CTA.WebForms.Extensions; namespace CTA.WebForms.Helpers { public static class FilePathHelper { private const string PreviousDirPathSymbol = ".."; private const string CurrentDirPathSymbol = "."; private const string FileNameDoesNotContainExtensionError = "Cannot alter file name, file name {0} does not end with extension {1}"; public static string AlterFileName(string oldFilePath, string newFileName = null, string oldExtension = null, string newExtension = null) { var actualOldExtension = oldExtension ?? Path.GetExtension(oldFilePath); var oldFileDirectory = Path.GetDirectoryName(oldFilePath); var oldFileName = Path.GetFileName(oldFilePath); if (!oldFileName.EndsWith(actualOldExtension, StringComparison.InvariantCultureIgnoreCase)) { throw new ArgumentException(string.Format(FileNameDoesNotContainExtensionError, oldFileName, actualOldExtension)); } var oldFileNameNoExtension = oldFileName.Substring(0, oldFileName.Length - actualOldExtension.Length); var newFileNameWithExtension = (newFileName ?? oldFileNameNoExtension) + (newExtension ?? actualOldExtension); if (!string.IsNullOrEmpty(oldFileDirectory)) { return Path.Combine(oldFileDirectory, newFileNameWithExtension); } return newFileNameWithExtension; } public static string GetNamespaceFromRelativeFilePath(string filePath, string projectName) { var cleanedFilePath = filePath.RemoveOuterQuotes(); var directoryName = Path.GetDirectoryName(cleanedFilePath); return string.IsNullOrEmpty(directoryName) ? directoryName : directoryName.Replace("~", projectName).Replace(Path.DirectorySeparatorChar.ToString(), "."); } public static string RemoveDuplicateDirectories(string filePath) { var directories = filePath.Split(Path.DirectorySeparatorChar); var lastDirectory = string.Empty; var result = string.Empty; foreach (var directory in directories) { if (!directory.Equals(lastDirectory)) { result = string.IsNullOrEmpty(result) ? directory : Path.Combine(result, directory); } lastDirectory = directory; } return result; } public static bool IsSubDirectory(string basePath, string otherPath) { var relativePath = Path.GetRelativePath(basePath, otherPath); var pathSeparator = Path.PathSeparator; var firstDir = relativePath.Split(Path.DirectorySeparatorChar).FirstOrDefault(); if (relativePath.Equals(otherPath) || relativePath.Equals(CurrentDirPathSymbol) || (firstDir?.Equals(PreviousDirPathSymbol) ?? true)) { return false; } return true; } } }