C#:获取相对路径的第一个目录名称

Lou*_*hys 7 .net c# string path

如何在相对路径中获取第一个目录名,因为它们可以是不同的接受目录分隔符?

例如:

foo\bar\abc.txt -> foo
bar/foo/foobar -> bar
Run Code Online (Sandbox Code Playgroud)

jb.*_*jb. 10

好像你可以在字符串上使用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"
Run Code Online (Sandbox Code Playgroud)

  • 我测试了本页面中的一系列方法(至少对于我的数据集),这似乎是最快但也是最一致的结果之一。我还用 `Path.DirectorySeparatorChar` 代替了字符。 (2认同)

Muh*_*han 8

适用于正斜杠和反斜杠

static string GetRootFolder(string path)
{
    while (true)
    {
        string temp = Path.GetDirectoryName(path);
        if (String.IsNullOrEmpty(temp))
            break;
        path = temp;
    }
    return path;
}
Run Code Online (Sandbox Code Playgroud)

  • 不要认为会返回第一个目录.但是因为它被标记为答案似乎它的目的是......在这种情况下问题是不正确的.请更新 (2认同)

bob*_*mcr 5

最强大的解决方案是使用DirectoryInfoFileInfo.在基于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;
    }
}
Run Code Online (Sandbox Code Playgroud)