12

如何获取文件夹+1的根目录?

示例:输入:C:\Level1\Level2\level3 输出应为:

Level1

如果输入是Level1 输出应该是Level1

如果输入是 C:\ 输出应该是empty string

是否有一个.Net函数处理这个?

Directory.GetDirectoryRoot总会回来的C:\

4

9 回答 9

13

您可以使用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;
}

但是,我更喜欢“轻量级”字符串方法。

于 2013-04-17T11:03:21.477 回答
5
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];
}
于 2013-04-17T11:04:42.567 回答
1

通过将下面的代码部分添加到方法中,您可以使用以下结构循环使用目录信息类

string path = "C:\Level1\Level2\level3";
DirectoryInfo d = new DirectoryInfo(path);
while (d.Parent.FullName != Path.GetPathRoot(path))
{
    d = d.Parent;
}
return d.FullName;
于 2013-04-17T11:10:06.413 回答
1

你可以使用DirectoryInfo和一个while循环。

DirectoryInfo info = new DirectoryInfo(path);
while (info.Parent != null && info.Parent.Parent != null)
    info = info.Parent;
string result = info.FullName;
于 2013-04-17T11:42:38.603 回答
0

一种可能的解决方案,但可能不是最好的,是找到@“\”的位置,并自己进行一些手动处理。下面的代码没有经过全面测试,只是片段:

//var positions = inputString.IndexOfAny(new [] {'\'});  //Original one
//Updated, thanks to Snixtor's 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;

当然,这仅在我们确定要在第二个“\”之后截断子字符串时才有效。

于 2013-04-17T11:01:13.367 回答
0

不确定这是否是正确的方法,但你这样做:

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

不确定 DirectoryInfo 对象是否可以以更清晰的方式获取此信息。

DirectoryInfo di = new DirectoryInfo(@"C:\Level1\Level2\Level3");
di.Root;
于 2013-04-17T11:03:22.117 回答
0

一个快乐的 linq 一个班轮:

string level1_2 = Directory.GetDirectoryRoot(path) + path.Split(Path.DirectorySeparatorChar).Skip(1).Take(1).DefaultIfEmpty("").First();
于 2013-04-17T11:14:14.547 回答
0
  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
于 2013-04-17T11:14:15.500 回答
0

为什么不只使用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:\")
    )
));

这将返回空字符串。

于 2013-04-17T11:42:25.857 回答