Получить корневой каталог папки +1

Как я могу получить корневой каталог папки +1?

Пример: Вход: C:\Level1\Level2\level3 вывод должен быть:

Level1

Если ввод Level1 выход должен быть Level1

если вход C:\output должен быть empty string

Есть ли функция .Net обрабатывает это?

Directory.GetDirectoryRoot всегда будет возвращать C:\

Ответ 1

Вы можете использовать Path -class + Substring + Split, чтобы удалить корень и получить верхнюю папку.

// your directory:
string dir = @"C:\Level1\Level2\level3";     

// C:\  
string root = Path.GetPathRoot(dir); 

// Level1\Level2\level3:
string pathWithoutRoot = dir.Substring(root.Length);       

// Level1
string firstFolder = pathWithoutRoot.Split(Path.DirectorySeparatorChar).First(); 

Другой способ - использовать класс DirectoryInfo и Parent:

DirectoryInfo directory = new DirectoryInfo(@"C:\Level1\Level2\level3");
string firstFolder = directory.Name;
while (directory.Parent != null && directory.Parent.Name != directory.Root.Name)
{
    firstFolder = directory.Parent.Name;
    directory = directory.Parent;
}

Однако, я бы предпочел "облегченные" строковые методы.

Ответ 2

string dir = @"C:\foo\bar\woah";
var dirSegments = dir.Split(new char[] { Path.DirectorySeparatorChar }, 
                            StringSplitOptions.RemoveEmptyEntries);
if (dirSegments.Length == 1)
{
    return string.Empty;
}
else
{
    return dirSegments[0] + Path.DirectorySeparatorChar + dirSegments[1];
}

Ответ 3

Не уверен, что это правильный способ, но вы делаете:

string s = @"C:\Level1\Level2\Level3";
string foo = s.split(@"\")[1];

Не уверен, что объект DirectoryInfo может получить это более чистым способом.

DirectoryInfo di = new DirectoryInfo(@"C:\Level1\Level2\Level3");
di.Root;

Ответ 4

Вы можете использовать цикл DirectoryInfo и while.

DirectoryInfo info = new DirectoryInfo(path);
while (info.Parent != null && info.Parent.Parent != null)
    info = info.Parent;
string result = info.FullName;

Ответ 5

Одно из возможных решений, но может быть не самое лучшее, - это найти позицию @ "\" и выполнить ручную обработку самостоятельно. Ниже код не полностью протестирован, просто сниппет:

//var positions = inputString.IndexOfAny(new [] {'\'});  //Original one
//Updated, thanks to Snixtor implementation 
var positions = inputString.IndexOfAny(new [] {Path.DirectorySeparatorChar}); 
int n=positions.Length;
if(n>=1)
{
     var pos = positions[1];  //The 2nd '\';
     return inputString.SubString(0, pos);
}
return null;

Конечно, это работает, только если мы уверены, что хотим получить подстроки после 2-го '.

Ответ 6

Вы можете выполнить цикл с использованием класса информации каталога, используя следующую структуру, добавив раздел кода ниже в метод

string path = "C:\Level1\Level2\level3";
DirectoryInfo d = new DirectoryInfo(path);
while (d.Parent.FullName != Path.GetPathRoot(path))
{
    d = d.Parent;
}
return d.FullName;

Ответ 7

Счастливый linq один лайнер:

string level1_2 = Directory.GetDirectoryRoot(path) + path.Split(Path.DirectorySeparatorChar).Skip(1).Take(1).DefaultIfEmpty("").First();

Ответ 8

  var di = new System.IO.DirectoryInfo(@"C:\a\b\c");
  Func<DirectoryInfo, DirectoryInfo> root = null;
  root = (info) => info.Parent.FullName.EndsWith("\\") ? info : root(info.Parent);
  var rootName = root(di).Name; //#a

Ответ 9

Почему бы просто не использовать System.IO.Path для извлечения имени?

MessageBox.Show(System.IO.Path.GetFileName(
    System.IO.Path.GetDirectoryName(
        System.IO.Path.GetDirectoryName(@"C:\Level1\Level2\Level3")
    )
));

Это возвращает Level 1.

MessageBox.Show(System.IO.Path.GetFileName(
    System.IO.Path.GetDirectoryName(
        System.IO.Path.GetDirectoryName(@"C:\")
    )
));

Это возвращает пустую строку.