C #: Получить первое имя каталога относительного пути - PullRequest
7 голосов
/ 27 октября 2011

Как получить первое имя каталога в относительном пути, учитывая, что они могут быть разными принятыми разделителями каталогов?

Например:

foo\bar\abc.txt -> foo
bar/foo/foobar -> bar

Ответы [ 6 ]

10 голосов
/ 27 октября 2011

Похоже, вы могли бы просто использовать метод string.Split () для строки, а затем захватить первый элемент.
пример (не проверено):

string str = "foo\bar\abc.txt";
string str2 = "bar/foo/foobar";


string[] items = str.split(new char[] {'/', '\'}, StringSplitOptions.RemoveEmptyEntries);

Console.WriteLine(items[0]); // prints "foo"

items = str2.split(new char[] {'/', '\'}, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(items[0]); // prints "bar"
8 голосов
/ 27 октября 2011

Работает с прямой и обратной косой чертой

static string GetRootFolder(string path)
{
    while (true)
    {
        string temp = Path.GetDirectoryName(path);
        if (String.IsNullOrEmpty(temp))
            break;
        path = temp;
    }
    return path;
}
5 голосов
/ 27 октября 2011

Самое надежное решение - использовать DirectoryInfo и FileInfo. В системе на базе Windows NT она должна принимать прямую или обратную косую черту для разделителей.

using System;
using System.IO;

internal class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine(GetTopRelativeFolderName(@"foo\bar\abc.txt")); // prints 'foo'
        Console.WriteLine(GetTopRelativeFolderName("bar/foo/foobar")); // prints 'bar'
        Console.WriteLine(GetTopRelativeFolderName("C:/full/rooted/path")); // ** throws
    }

    private static string GetTopRelativeFolderName(string relativePath)
    {
        if (Path.IsPathRooted(relativePath))
        {
            throw new ArgumentException("Path is not relative.", "relativePath");
        }

        FileInfo fileInfo = new FileInfo(relativePath);
        DirectoryInfo workingDirectoryInfo = new DirectoryInfo(".");
        string topRelativeFolderName = string.Empty;
        DirectoryInfo current = fileInfo.Directory;
        bool found = false;
        while (!found)
        {
            if (current.FullName == workingDirectoryInfo.FullName)
            {
                found = true;
            }
            else
            {
                topRelativeFolderName = current.Name;
                current = current.Parent;
            }
        }

        return topRelativeFolderName;
    }
}
2 голосов
/ 19 октября 2016

На основании ответа, предоставленного Хасан Ханом ...

private static string GetRootFolder(string path)
{
    var root = Path.GetPathRoot(path);
    while (true)
    {
        var temp = Path.GetDirectoryName(path);
        if (temp != null && temp.Equals(root))
            break;
        path = temp;
    }
    return path;
}

Это даст папку верхнего уровня

1 голос
/ 07 ноября 2011

Исходя из вашего вопроса, должно работать следующее:

    public string GetTopLevelDir(string filePath)
    {
        string temp = Path.GetDirectoryName(filePath);
        if(temp.Contains("\\"))
        {
            temp = temp.Substring(0, temp.IndexOf("\\"));
        }
        else if (temp.Contains("//"))
        {
            temp = temp.Substring(0, temp.IndexOf("\\"));
        }
        return temp;
    }

Когда передано foo\bar\abc.txt, оно будет foo как требуется - то же самое для / case

0 голосов
/ 27 октября 2011

Вот еще один пример, если ваш путь в следующем формате:

string path = "c:\foo\bar\abc.txt"; // or c:/foo/bar/abc.txt
string root = Path.GetPathRoot(path); // root == c:\
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...