如何获取文件夹的根目录+1?
实施例:
输入:C:\Level1\Level2\level3
输出应该是:
Level1
如果输入为Level1
输出应为Level1
如果输入为C:\ output应为empty string
是否有.Net功能处理这个?
Directory.GetDirectoryRoot
将始终返回C:\
答案 0 :(得分:12)
您可以使用Path
- 类+ 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;
}
但是,我更喜欢“轻量级”字符串方法。
答案 1 :(得分: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];
}
答案 2 :(得分:1)
不确定这是否是正确的方法,但确实如此:
string s = @"C:\Level1\Level2\Level3";
string foo = s.split(@"\")[1];
不确定DirectoryInfo对象是否可以更清晰地获取此内容。
DirectoryInfo di = new DirectoryInfo(@"C:\Level1\Level2\Level3");
di.Root;
答案 3 :(得分:1)
您可以使用DirectoryInfo
和while
循环。
DirectoryInfo info = new DirectoryInfo(path);
while (info.Parent != null && info.Parent.Parent != null)
info = info.Parent;
string result = info.FullName;
答案 4 :(得分: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;
当然,这只有在我们确定我们想在第二个'\'后面的剁子串时才有效。
答案 5 :(得分:0)
您可以使用以下结构使用目录info类循环,方法是将下面的代码部分添加到方法
中string path = "C:\Level1\Level2\level3";
DirectoryInfo d = new DirectoryInfo(path);
while (d.Parent.FullName != Path.GetPathRoot(path))
{
d = d.Parent;
}
return d.FullName;
答案 6 :(得分:0)
一个快乐的linq one liner:
string level1_2 = Directory.GetDirectoryRoot(path) + path.Split(Path.DirectorySeparatorChar).Skip(1).Take(1).DefaultIfEmpty("").First();
答案 7 :(得分: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
答案 8 :(得分: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:\")
)
));
返回空字符串。