/// <summary> /// Determines the full path for the given file-spec. /// ASSUMES INPUT IS STILL ESCAPED /// </summary> /// <param name="fileSpec">The file spec to get the full path of.</param> /// <param name="currentDirectory"></param> /// <returns>full path</returns> internal static string GetFullPath(string fileSpec, string currentDirectory) { // Sending data out of the engine into the filesystem, so time to unescape. fileSpec = FixFilePath(EscapingUtilities.UnescapeAll(fileSpec)); // Data coming back from the filesystem into the engine, so time to escape it back. string fullPath = EscapingUtilities.Escape(NormalizePath(Path.Combine(currentDirectory, fileSpec))); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && !EndsWithSlash(fullPath)) { if (FileUtilitiesRegex.IsDrivePattern(fileSpec) || FileUtilitiesRegex.IsUncPattern(fullPath)) { // append trailing slash if Path.GetFullPath failed to (this happens with drive-specs and UNC shares) fullPath += Path.DirectorySeparatorChar; } } return(fullPath); }
/// <summary> /// Indicates whether the given path is a UNC or drive pattern root directory. /// <para>Note: This function mimics the behavior of checking if Path.GetDirectoryName(path) == null.</para> /// </summary> /// <param name="path"></param> /// <returns></returns> private static bool IsRootDirectory(string path) { // Eliminate all non-rooted paths if (!Path.IsPathRooted(path)) { return(false); } int uncMatchLength = FileUtilitiesRegex.StartsWithUncPatternMatchLength(path); // Determine if the given path is a standard drive/unc pattern root if (FileUtilitiesRegex.IsDrivePattern(path) || FileUtilitiesRegex.IsDrivePatternWithSlash(path) || uncMatchLength == path.Length) { return(true); } // Eliminate all non-root unc paths. if (uncMatchLength != -1) { return(false); } // Eliminate any drive patterns that don't have a slash after the colon or where the 4th character is a non-slash // A non-slash at [3] is specifically checked here because Path.GetDirectoryName // considers "C:///" a valid root. if (FileUtilitiesRegex.StartsWithDrivePattern(path) && ((path.Length >= 3 && path[2] != '\\' && path[2] != '/') || (path.Length >= 4 && path[3] != '\\' && path[3] != '/'))) { return(false); } // There are some edge cases that can get to this point. // After eliminating valid / invalid roots, fall back on original behavior. return(Path.GetDirectoryName(path) == null); }