削减一部分路径

时间:2010-09-20 16:30:35

标签: c# path

我有两条路:'C:\ ol \ il \ ek'和'ek \ mek \ gr'。如何从这些路径中切割出公共部分?我正在从它们那里制作一条路径(h-第一条路径,n条路径):

                 ee.Load(h + "\\" + n);

2 个答案:

答案 0 :(得分:3)

假设“公共部分”始终是第一条路径的最后一段,而第二条路径的第一段,则可以使用Path.GetDirectoryName从第一条路径中剥离此段,并将结果与使用Path.Combine的第二条路径:

var result = Path.Combine(Path.GetDirectoryName(@"C:\ol\il\ek"), @"ek\mek\gr");

//  result == @"C:\ol\il\ek\mek\gr"

答案 1 :(得分:0)

我写了以下课程,我认为可以满足您的需求。首先,我在单个目录部分中拆分路径。比我用path2的第一个检查path1的最后部分,增加我比较的部分数量,直到达到部件限制或得到相等的部分。 当我在两条路径中找到相等的部分时,我清除了路径2部分。

static class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(JoinPaths(@"C:\ol\il\ek", @"ek\mek\gr"));
        Console.WriteLine(JoinPaths(@"C:\ol\il\ek", @"il\ek\mek\gr"));
        Console.WriteLine(JoinPaths(@"C:\ol\il\ek", @"ol\il\ek\mek\gr"));

        Console.ReadLine();
    }

    public static T[] Slice<T>(this T[] source, int start, int end)
    {
        if (end < 0)
            end = source.Length + end;
        var len = end - start;
        var res = new T[len];
        for (var i = 0; i < len; i++)
            res[i] = source[i + start];
        return res;
    }

    private static string JoinPaths(string path1, string path2)
    {
        var parts1 = path1.ToLower().Split(new char[] { '\\' });
        var parts2 = path2.ToLower().Split(new char[] { '\\' });

        int commonPartLen = 1;
        while (commonPartLen<parts1.Length && commonPartLen<parts2.Length)
        {
            string slice1 = string.Join("\\", parts1.Slice(parts1.Length - commonPartLen, parts1.Length ));
            string slice2 = string.Join("\\", parts2.Slice(0, commonPartLen));

            if (slice1 == slice2)
            {
                for (var i = 0; i < commonPartLen; i++)
                    parts2[i] = "";
                break;
            }
            commonPartLen++;
        }


        string firstPath = string.Join("\\", parts1.Where(a => !string.IsNullOrEmpty(a)));
        string secondPath = string.Join("\\", parts2.Where(a => !string.IsNullOrEmpty(a)));
        return firstPath + "\\"+secondPath; ;
    }
}

我希望代码清晰。