public static string PathMakeStandard(string path) { return(PathMakeStandard(path, !Util.IsRunningOnUnix())); }
static FileSystemStringComparer() { s_hostOsIsCaseSensitive = Util.IsRunningOnUnix(); }
public static unsafe string SimplifyPath(string path) { if (path.Length == 0) { return(string.Empty); } if (path == ".") { return(path); } string simplifiedPath = s_cachedSimplifiedPaths.GetOrAdd(path, s => { // First construct a path helper to help with the conversion char *arrayPtr = stackalloc char[PathHelper.MaxPath]; PathHelper pathHelper = new PathHelper(arrayPtr, PathHelper.MaxPath); int index = 0; int pathLength = path.Length; int numDot = 0; int lowestRemovableIndex = 0; for (; index < pathLength; ++index) { char currentChar = path[index]; if (currentChar == OtherSeparator) { currentChar = Path.DirectorySeparatorChar; } if (currentChar == '.') { ++numDot; if (numDot > 2) { throw new ArgumentException($"Invalid path format: {path}"); } } else { if (numDot == 1) { if (currentChar == Path.DirectorySeparatorChar) { // Path starts a path of the format .\ numDot = 0; continue; } else { pathHelper.Append('.'); } numDot = 0; pathHelper.Append(currentChar); } else if (numDot == 2) { if (currentChar != Path.DirectorySeparatorChar) { throw new ArgumentException($"Invalid path format: {path}"); } // Path contains a path of the format ..\ bool success = pathHelper.RemoveLastDirectory(lowestRemovableIndex); if (!success) { pathHelper.Append('.'); pathHelper.Append('.'); lowestRemovableIndex = pathHelper.Length; } numDot = 0; if (pathHelper.Length > 0) { pathHelper.Append(currentChar); } } else { if (Util.IsRunningOnUnix() && index == 0 && currentChar == Path.DirectorySeparatorChar && Path.IsPathRooted(path)) { pathHelper.Append(currentChar); } if (currentChar != Path.DirectorySeparatorChar || pathHelper.Length > 0) { pathHelper.Append(currentChar); } } } } if (numDot == 2) { // Path contains a path of the format \..\ if (!pathHelper.RemoveLastDirectory(lowestRemovableIndex)) { pathHelper.Append('.'); pathHelper.Append('.'); } } return(pathHelper.ToString()); }); return(simplifiedPath); }