File: Utilities\PathUtilities.cs
Web Access
Project: ..\..\..\src\BuiltInTools\dotnet-watch\dotnet-watch.csproj (dotnet-watch)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
namespace Microsoft.DotNet.Watch;
 
internal static class PathUtilities
{
    public static readonly IEqualityComparer<string> OSSpecificPathComparer = Path.DirectorySeparatorChar == '\\' ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal;
    public static readonly StringComparison OSSpecificPathComparison = Path.DirectorySeparatorChar == '\\' ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal;
 
    public static string EnsureTrailingSlash(string path)
        => (path is [.., var last] && last != Path.DirectorySeparatorChar) ? path + Path.DirectorySeparatorChar : path;
 
    public static string NormalizeDirectorySeparators(string path)
        => path.Replace('\\', Path.DirectorySeparatorChar).Replace('/', Path.DirectorySeparatorChar);
 
    public static bool ContainsPath(IReadOnlySet<string> directories, string fullPath)
    {
        if (directories.Count == 0)
        {
            return false;
        }
 
        fullPath = Path.TrimEndingDirectorySeparator(fullPath);
 
        while (true)
        {
            if (directories.Contains(fullPath))
            {
                return true;
            }
 
            var containingDir = Path.GetDirectoryName(fullPath);
            if (containingDir == null)
            {
                return false;
            }
 
            fullPath = containingDir;
        }
    }
 
    public static IEnumerable<string> GetContainingDirectories(string path)
    {
        while (true)
        {
            var containingDir = Path.GetDirectoryName(path);
            if (containingDir == null)
            {
                yield break;
            }
 
            yield return containingDir;
            path = containingDir;
        }
    }
}