Given full path, check if path is subdirectory of some other path, or otherwise

前端 未结 9 1354
难免孤独
难免孤独 2020-12-03 13:22

I have 2 strings - dir1 and dir2, and I need to check if one is sub-directory for other. I tried to go with Contains method:

dir1.contains(dir2);
         


        
9条回答
  •  隐瞒了意图╮
    2020-12-03 14:06

    Based on @BrokenGlass's answer but tweaked:

    using System.IO;
    
    internal static class DirectoryInfoExt
    {
        internal static bool IsSubDirectoryOfOrSame(this DirectoryInfo directoryInfo, DirectoryInfo potentialParent)
        {
            if (DirectoryInfoComparer.Default.Equals(directoryInfo, potentialParent))
            {
                return true;
            }
    
            return IsStrictSubDirectoryOf(directoryInfo, potentialParent);
        }
    
        internal static bool IsStrictSubDirectoryOf(this DirectoryInfo directoryInfo, DirectoryInfo potentialParent)
        {
            while (directoryInfo.Parent != null)
            {
                if (DirectoryInfoComparer.Default.Equals(directoryInfo.Parent, potentialParent))
                {
                    return true;
                }
    
                directoryInfo = directoryInfo.Parent;
            }
    
            return false;
        }
    }
    

    using System;
    using System.Collections.Generic;
    using System.IO;
    
    public class DirectoryInfoComparer : IEqualityComparer
    {
        private static readonly char[] TrimEnd = { '\\' };
        public static readonly DirectoryInfoComparer Default = new DirectoryInfoComparer();
        private static readonly StringComparer OrdinalIgnoreCaseComparer = StringComparer.OrdinalIgnoreCase;
    
        private DirectoryInfoComparer()
        {
        }
    
        public bool Equals(DirectoryInfo x, DirectoryInfo y)
        {
            if (ReferenceEquals(x, y))
            {
                return true;
            }
    
            if (x == null || y == null)
            {
                return false;
            }
    
            return OrdinalIgnoreCaseComparer.Equals(x.FullName.TrimEnd(TrimEnd), y.FullName.TrimEnd(TrimEnd));
        }
    
        public int GetHashCode(DirectoryInfo obj)
        {
            if (obj == null)
            {
                throw new ArgumentNullException(nameof(obj));
            }
            return OrdinalIgnoreCaseComparer.GetHashCode(obj.FullName.TrimEnd(TrimEnd));
        }
    }
    

    Not ideal if performance is essential.

提交回复
热议问题