如何获取文件夹+1的根目录?
示例:输入:C:\Level1\Level2\level3
输出应为:
Level1
如果输入是Level1
输出应该是Level1
如果输入是 C:\ 输出应该是empty string
是否有一个.Net函数处理这个?
Directory.GetDirectoryRoot
总会回来的C:\
您可以使用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;
}
但是,我更喜欢“轻量级”字符串方法。
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];
}
通过将下面的代码部分添加到方法中,您可以使用以下结构循环使用目录信息类
string path = "C:\Level1\Level2\level3";
DirectoryInfo d = new DirectoryInfo(path);
while (d.Parent.FullName != Path.GetPathRoot(path))
{
d = d.Parent;
}
return d.FullName;
你可以使用DirectoryInfo
和一个while
循环。
DirectoryInfo info = new DirectoryInfo(path);
while (info.Parent != null && info.Parent.Parent != null)
info = info.Parent;
string result = info.FullName;
一种可能的解决方案,但可能不是最好的,是找到@“\”的位置,并自己进行一些手动处理。下面的代码没有经过全面测试,只是片段:
//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;
当然,这仅在我们确定要在第二个“\”之后截断子字符串时才有效。
不确定这是否是正确的方法,但你这样做:
string s = @"C:\Level1\Level2\Level3";
string foo = s.split(@"\")[1];
不确定 DirectoryInfo 对象是否可以以更清晰的方式获取此信息。
DirectoryInfo di = new DirectoryInfo(@"C:\Level1\Level2\Level3");
di.Root;
一个快乐的 linq 一个班轮:
string level1_2 = Directory.GetDirectoryRoot(path) + path.Split(Path.DirectorySeparatorChar).Skip(1).Take(1).DefaultIfEmpty("").First();
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
为什么不只使用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:\")
)
));
这将返回空字符串。