at Как можно получить абсолютный или нормализованный путь к файлу в .NET? Я вижу
public static string NormalizePath(string path)
{
return Path.GetFullPath(new Uri(path).LocalPath)
.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
.ToUpperInvariant();
}
, поэтому я бы начал с этого, чтобы нормализовать два пути (см. Такжеhttps://blogs.msdn.microsoft.com/jeremykuhne/2016/04/21/path-normalization/ в случае, если это покрывает больше случаев)
тогда я бы разделил их на массивы / списки подпутей (скажем, одним из методов из Как извлечь из каждого имени папкипуть? )
оттуда я бы нашел максимум N первых частей, которые являются общими.
тогда я бы вычел N из числа частей первого пути C, то есть CN, чтобы узнать, сколько ... \ Мне нужно добавить к первому пути, чтобы вернуться к общему пути.
наконец, я бы добавил оставшуюся часть toPath после удаления из него первых N элементов и вернул бы полученный путь
Думаю, вы также можете сделать это (чтобы избежать дополнительного хранения) со строкойРазбор (без разделения на списки), как только вы нашли нормализованные пути. Идея состоит в том, что вы найдете общий префикс строки и затем обрежете последнюю его часть, если общая часть не заканчивается разделителем пути (поскольку это будет случайная дополнительная общая часть, например, c: \ a\ test1 и c: \ a \ test2 имеют общий путь c: \ a \, а не c: \ a \ test, как вы могли бы получить с простым извлечением строки общего префикса).
В качестве альтернативы вы можете использоватьалгоритм, который возвращает индексы символов для каждого \ обработки двух нормализованных путей одновременно в цикле (по одному шагу на каждом), так что вам не нужно хранить что-то дополнительное. Логика будет аналогична описанной выше.