Как проверить, является ли каталог 1 подкаталогом каталога dir2 и наоборот

Какой простой способ проверить, является ли каталог 1 подкаталогом каталога 2 и наоборот?

Я проверил вспомогательные классы Path и DirectoryInfo, но не нашел для этого функции, готовой к работе системы. Я думал, что это будет где-то там.

У вас, ребята, есть идея, где это найти?

Я сам пытался выписать чек, но это сложнее, чем я ожидал, когда начал.

18
задан sjors miltenburg 19 August 2010 в 20:07
поделиться

5 ответов

Вы можете сравнить directory2 со свойством Parent directory1 при использовании DirectoryInfo в обоих случаях.

DirectoryInfo d1 = new DirectoryInfo(@"C:\Program Files\MyApp");
DirectoryInfo d2 = new DirectoryInfo(@"C:\Program Files\MyApp\Images");

if(d2.Parent.FullName == d1.FullName)
{
    Console.WriteLine ("Sub directory");
}
-10
ответ дан 30 November 2019 в 09:25
поделиться

Полное имя второго каталога (d2) будет содержать полное имя первого каталога (d1), если это подпапка d1.

Предполагается, что вы используете действительные каталоги.

if (d2.FullName.Contains(d1.FullName))
{
     //dowork
}

Если вам нужно проверить подключенные диски, вы можете попробовать

    static void Main(string[] args)
    {
        if (GetUNCPath(d2.FullName).ToLower().Contains(GetUNCPath(d1.FullName).ToLower()))
        {
        }
    }

    [DllImport("mpr.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern int WNetGetConnection(
        [MarshalAs(UnmanagedType.LPTStr)] string localName,
        [MarshalAs(UnmanagedType.LPTStr)] StringBuilder remoteName, ref int length);

    private static string GetUNCPath(string originalPath)
    {

        StringBuilder sb = new StringBuilder(512);
        int size = sb.Capacity;
        // look for the {LETTER}: combination ...
        if (originalPath.Length > 2 && originalPath[1] == ':')
        {
            // don't use char.IsLetter here - as that can be misleading
            // the only valid drive letters are a-z && A-Z.
            char c = originalPath[0];
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
            {
                int error = WNetGetConnection(originalPath.Substring(0, 2), sb, ref size);
                if (error == 0)
                {
                    DirectoryInfo dir = new DirectoryInfo(originalPath);
                    string path = Path.GetFullPath(originalPath).Substring(Path.GetPathRoot(originalPath).Length);
                    return Path.Combine(sb.ToString().TrimEnd(), path);
                }
            }
        }
        return originalPath;
    }

Код для подключенного диска взят из http://social.msdn.microsoft.com/Forums / en / csharpgeneral / thread / 6f79f2b3-d092-431f-bc28-d15d93cf5d09

1
ответ дан 30 November 2019 в 09:25
поделиться

Если у вас есть два пути, посмотрите на это:

Нормализовать имена каталогов в C #

http://filedirectorypath.codeplex.com/ (я не знаю его качества)

И используйте это:

var ancestor = new DirectoryPathAbsolute(ancestorPath);
var child = new DirectoryPathAbsolute(childPath);

var res = child.IsChildDirectoryOf(ancestor); //I don't think it actually checks for case-sensitive filesystems

В противном случае, если вы хотите узнать, существует ли каталог как подкаталог в пути, посмотрите:

Directory.EnumerateDirectories

Пришел в .Net 4.0 . Пример:

Содержит ли путь каталог, начинающийся с Консоль :

//* is a wildcard. If you remove it, it search for directories called "Console"
var res = Directory.EnumerateDirectories(@path, "Console*", SearchOption.AllDirectories).Any();
1
ответ дан 30 November 2019 в 09:25
поделиться

Вы можете использовать Path.GetDirectoryName Method , чтобы получить родительский каталог. Это работает и для каталогов.

0
ответ дан 30 November 2019 в 09:25
поделиться

DirectoryInfo имеет свойство Parent, которое также является типом DirectoryInfo. Вы можете использовать это, чтобы определить, является ли ваш каталог подкаталогом родительского каталога.

1
ответ дан 30 November 2019 в 09:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: