我有两条路:'C:\ ol \ il \ ek'和'ek \ mek \ gr'。如何从这些路径中切割出公共部分?我正在从它们那里制作一条路径(h-第一条路径,n条路径):
ee.Load(h + "\\" + n);
答案 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; ;
}
}
我希望代码清晰。