我正在寻找一种更好/更安全/更优雅的通用方法,它可以从给定路径给我一个深度很长的目录。
我已经创建了一些有效但基于字符串解析的东西,所以我希望你能找到更好的解决方案。该方法也可以使用目录信息来传递/返回值。
public static string GetDirectoryNDepth(string root, string target, int depth)
{
string[] splittedRoot = root.Split('\\');
string[] splittedTarget = target.Split('\\');
StringBuilder sb = new StringBuilder();
for (int i = 0; i < splittedTarget.Length; i++)
if (i < splittedRoot.Count() + depth)
sb.Append(String.Format("{0}\\", splittedTarget[i]));
else
break;
return sb.ToString();
}
示例值:
//For 3 depth long parametr it should return expected value
//First case filepath
string root = @"C\Desktop\temp\MSC\IH";
string target = @"C:\Desktop\temp\MSC\IH\FirstLevel\SecondLevel\ThirdLevel\dsf - Copy (2).xml";
string expected = @"C:\Desktop\temp\MSC\IH\FirstLevel\SecondLevel\ThirdLevel";
//Second case target shorter then depth
string root = @"C\Desktop\temp\MSC\IH";
string target = @"C:\Desktop\temp\MSC\IH\FirstLevel\SecondLevel";
string expected = @"C:\Desktop\temp\MSC\IH\FirstLevel\SecondLevel";
答案 0 :(得分:1)
从您的评论中,您可以使用Path.DirectorySeparatorChar而不是\
作为分隔符
public string GetDirectoryNDepth(string root, string target, int depth)
{
string[] splittedRoot = root.Split(Path.DirectorySeparatorChar);
string[] splittedTarget = target.Split(Path.DirectorySeparatorChar);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < splittedTarget.Length; i++)
if (i < splittedRoot.Length + depth)
sb.Append(String.Format("{0}{1}", splittedTarget[i], Path.DirectorySeparatorChar));
else
break;
return sb.ToString();
}
来自Path.DirectorySeparatorChar
doc:
提供用于分隔目录的特定于平台的字符 反映分层文件系统的路径字符串中的级别 组织...
...此字段的值是UNIX上的斜杠(“/”)和反斜杠 (“\”)在Windows和Macintosh操作系统上。
答案 1 :(得分:0)
我发现输入集非常特别,root不是以C开头的:它是C \
不知道是否有意为
string root = @"C\Desktop\temp\MSC\IH";
string target = @"C:\Desktop\temp\MSC\IH\FirstLevel\SecondLevel\ThirdLevel\dsf - Copy (2).xml";
string expected = @"C:\Desktop\temp\MSC\IH\FirstLevel\SecondLevel\ThirdLevel";
基于输入样本&amp;代码这将是有效的代码
public static string GetDirectoryNDepth(string root, string target, int depth)
{
var separatorChar = Path.DirectorySeparatorChar;
int rootSlashCount = root.Split(separatorChar).Length;
int totalSlashCount = rootSlashCount + depth;
var iCnt = root.Length;
while(iCnt < target.Length && rootSlashCount <= totalSlashCount)
{
if (target[iCnt] == separatorChar)
rootSlashCount++;
iCnt++;
}
var retVal = target.Substring(0, iCnt);
if (retVal.EndsWith(separatorChar+"") == false)
retVal += separatorChar;
return retVal;
}