没有内置的方式来做你想做的事。以下代码应该可以解决问题:
public static string GetFolderByLevel(this string path, string baseFolderName, int level)
{
if (path == null)
throw new ArgumentNullException("path");
if (baseFolderName == null)
throw new ArgumentNullException("baseFolderName");
var pathWithoutFile = Path.GetDirectoryName(path);
var folders = pathWithoutFile.ToString().Split(Path.DirectorySeparatorChar);
int baseFolderLevel = -1;
for (int i = 0; i < folders.Length; ++i)
{
if (string.Compare(folders[i], baseFolderName, true) == 0)
{
baseFolderLevel = i;
break;
}
}
if (baseFolderLevel == -1)
throw new ArgumentException(string.Format("Folder '{0}' could not be found in specified path: {1}", baseFolderName, path), "baseFolderName");
int index = baseFolderLevel + level;
if (-1 < index && index < folders.Length)
{
return folders[index];
}
else
throw new ArgumentOutOfRangeException(string.Format("Specified level is out of range."));
}
现在你可以像这样使用它:
string path = @"C:\Users\dynamic user\Desktop\History\Peter\record.xls";
path.GetFolderByLevel("Desktop", -2); //returns "Users"
path.GetFolderByLevel("History", 0); //returns "History"
path.GetFolderByLevel("Desktop", 1); //returns "History"
在你的情况下,如果我没记错的话,你正在寻找path.GetFolderByLevel("Desktop", 1);
更新:我已经修改了之前的解决方案,以便您可以使用部分或完整路径指定 基本文件夹:
public static string GetFolderByLevel(this string path, string baseFolderPath, int level)
{
if (path == null)
throw new ArgumentNullException("path");
if (baseFolderPath == null)
throw new ArgumentNullException("baseFolderName");
var pathFolders = path.Split(new char[] {Path.DirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries);
var basePathFolders = baseFolderPath.Split(new char[] { Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries);
int baseFolderIndex = -1;
int folderCounter = 0;
for (int i = 0; i < pathFolders.Length; ++i)
{
if (string.Compare(pathFolders[i], basePathFolders[folderCounter], true) == 0)
{
if (++folderCounter == basePathFolders.Length)
{
baseFolderIndex = i;
break;
}
}
else
{
folderCounter = 0;
}
}
if (baseFolderIndex < 0)
throw new ArgumentException(string.Format("Folder '{0}' could not be found in specified path: {1}", baseFolderPath, path), "baseFolderName");
int index = baseFolderIndex + level;
if (-1 < index && index < pathFolders.Length)
{
return pathFolders[index];
}
else
throw new ArgumentOutOfRangeException(string.Format("Specified level is out of range."));
}
现在你可以像这样使用它:path.GetFolderByLevel(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), 1);
另一个优点是在嵌套文件夹同名的情况下,您可以指定基本文件夹的唯一部分路径,以确保方法选择正确的路径。