获取给定根路径的深度目录路径

时间:2015-01-10 18:05:16

标签: c# path

我正在寻找一种更好/更安全/更优雅的通用方法,它可以从给定路径给我一个深度很长的目录。

我已经创建了一些有效但基于字符串解析的东西,所以我希望你能找到更好的解决方案。该方法也可以使用目录信息来传递/返回值。

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";

2 个答案:

答案 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;

    }