Exemplo n.º 1
0
 public static string PathMakeStandard(string path)
 {
     return(PathMakeStandard(path, !Util.IsRunningOnUnix()));
 }
Exemplo n.º 2
0
 static FileSystemStringComparer()
 {
     s_hostOsIsCaseSensitive = Util.IsRunningOnUnix();
 }
Exemplo n.º 3
0
        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);
        }