【问题标题】:How can I determine the topmost folder (root) of a relative path?如何确定相对路径的最顶层文件夹(根)?
【发布时间】:2013-03-07 00:38:31
【问题描述】:

给定相对路径字符串:

"SomeFolder\\Container\\file.txt"

我想确定最顶层的父文件夹或根文件夹"SomeFolder"

Path.GetPathRoot("SomeFolder\\Container\\file.txt"); // returns empty

我宁愿避免使用“string voodoo”,以便将其移植到具有不同目录分隔符的系统。

是否有一些我忽略的明显方法?

【问题讨论】:

  • Uri 类对于这种方案有很多方法,但是我不能说哪种方法适用于所有情况。
  • msdn.microsoft.com/en-us/library/… 将协助移植字符串巫毒方法
  • 顺便说一句,您可以“规范化”路径以使用 / 而不是 \,因为 Windows 操作系统很乐意接受这两者。
  • Downvoters:你觉得我可以做些什么来改善这个问题?

标签: c# .net path


【解决方案1】:

@Will 建议使用Uri 类,我已将其用于其他一些路径操作,效果很好。

我用以下方法解决了这个问题:

/// <summary>
/// Returns the path root if absolute, or the topmost folder if relative.
/// The original path is returned if no containers exist.
/// </summary>
public static string GetTopmostFolder(string path)
{
    if (path.StartsWith(Path.DirectorySeparatorChar.ToString()))
        path = path.Substring(1);

    Uri inputPath;

    if (Uri.TryCreate(path, UriKind.Absolute, out inputPath))
        return Path.GetPathRoot(path);

    if (Uri.TryCreate(path, UriKind.Relative, out inputPath))
        return path.Split(Path.DirectorySeparatorChar)[0];

    return path;
}

编辑:

修改为去除前导目录分隔符。我预计它们不会有任何输入字符串,但最好计划一下以防万一。

【讨论】:

  • 有趣的方法,但是,如果您的路径是 \\SomeFolder\\Container\\file.txt 的形式,它会中断。
  • 好点。我不希望将其作为输入,但我将编辑该方法,以去除前导目录分隔符,根据需要我认为这是可选的。
  • 听起来像 "string voodoo" =P
  • 至少它是跨平台兼容的(我们希望)voodoo。 :)
【解决方案2】:

来自Path.GetPathRoot Method

返回path的根目录,如 "C:\",如果路径为空,则为空,如果路径不为空,则为空字符串 包含根目录信息。

您的路径未植根。这就是为什么你得到空字符串的原因。在调用GetPathRoot() 之前,您应该先检查路径是否已植根。

var somePath = "SomeFolder\\Container\\file.txt";

String root;
if (Path.IsPathRooted(somePath))
    root = Path.GetPathRoot(somePath);
else
    root = somePath.Split(Path.DirectorySeparatorChar).First();

【讨论】:

  • @Blorgbeard 我的编辑回答了这个问题。如果路径不是Path 助手可以使用的形式,我会求助于字符串操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 2018-02-20
  • 2014-08-23
相关资源
最近更新 更多