C # Лучший способ получить глубину папки для данного пути? - PullRequest
10 голосов
/ 25 ноября 2008

Я работаю над тем, что требует прохождения через файловую систему, и для любого заданного пути мне нужно знать, насколько «глубоко» я нахожусь в структуре папок. Вот что я сейчас использую:

int folderDepth = 0;
string tmpPath = startPath;

while (Directory.GetParent(tmpPath) != null) 
{
    folderDepth++;
    tmpPath = Directory.GetParent(tmpPath).FullName;
}
return folderDepth;

Это работает, но я подозреваю, что есть лучший / более быстрый способ? Большое спасибо за любые отзывы.

Ответы [ 6 ]

12 голосов
/ 25 ноября 2008

с макушки головы:

Directory.GetFullPath().Split("\\").Length;
7 голосов
/ 12 ноября 2015

Я опоздал с этим, но хотел бы отметить, что ответ Пола Сонье, вероятно, самый короткий, но должен быть:

 Path.GetFullPath(tmpPath).Split(Path.DirectorySeparatorChar).Length;
4 голосов
/ 25 ноября 2008

Я всегда фанат рекурсивных решений. Неэффективно, но весело!

public static int FolderDepth(string path)
{
    if (string.IsNullOrEmpty(path))
        return 0;
    DirectoryInfo parent = Directory.GetParent(path);
    if (parent == null)
        return 1;
    return FolderDepth(parent.FullName) + 1;
}

Мне нравится код на Лиспе, написанный на C #!

Вот еще одна рекурсивная версия, которая мне нравится еще лучше и, вероятно, более эффективна:

public static int FolderDepth(string path)
{
    if (string.IsNullOrEmpty(path))
        return 0;
    return FolderDepth(new DirectoryInfo(path));
}

public static int FolderDepth(DirectoryInfo directory)
{
    if (directory == null)
        return 0;
    return FolderDepth(directory.Parent) + 1;
}

Хорошие времена, хорошие времена ...

3 голосов
/ 25 ноября 2008

Предполагая, что ваш путь уже проверен на правильность, в .NET 3.5 вы также можете использовать LINQ, чтобы сделать это в 1 строке кода ...

Console.WriteLine (@ "C: \ Folder1 \ Folder2 \ folder3 \ Folder4 \ MyFile.txt" .где (с => c = @ "\"). Count);

1 голос
/ 25 ноября 2008

Если вы используете члены класса Path, вы можете справиться с локализацией символа разделения пути и другими предупреждениями, связанными с путем. Следующий код предоставляет глубину (включая корень). Это не подходит для плохих строк и тому подобного, но это начало для вас.

int depth = 0;
do
{
    path = Path.GetDirectoryName(path);
    Console.WriteLine(path);
    ++depth;
} while (!string.IsNullOrEmpty(path));

Console.WriteLine("Depth = " + depth.ToString());
0 голосов
/ 09 августа 2018

Если в конце каталога есть обратная косая черта, вы получите другой ответ, чем когда его нет. Вот надежное решение проблемы.

string pathString = "C:\\temp\\"
var rootFolderDepth = pathString.Split(Path.DirectorySeparatorChar).Where(i => i.Length > 0).Count();

Возвращает длину пути 2. Если вы делаете это без оператора where, вы получите длину пути 3 или длину пути 2, если опустите последний символ-разделитель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...