Reputation: 3170
I have 2 file-paths.
eg:
Path 1 C:\Users\Me\FileFolder\File1.info
Path 2 C:\Users\Me\FileFolder\DirectoryContent\Content1\File.info
I want to create a method to extract the repeated path:
Result C:\Users\Me\FileFolder
Is there a method to do this? Or how it can be done?
Upvotes: 0
Views: 73
Reputation: 460098
I assume you want to find all common folders, so the path that is shared from both, try this:
string path1 = @"C:\Users\Me\FileFolder\File1.info";
string path2 = @"C:\Users\Me\FileFolder\DirectoryContent\Content1\File.info";
string root1 = Path.GetPathRoot(path1);
string root2 = Path.GetPathRoot(path2);
if (root1.Equals(root2, StringComparison.InvariantCultureIgnoreCase))
{
string[] folders1 = path1.Split(Path.DirectorySeparatorChar);
string[] folders2 = path2.Split(Path.DirectorySeparatorChar);
var commonFolders = folders1.TakeWhile((dir, index) =>
folders2.Length > index &&
dir.Equals(folders2[index], StringComparison.InvariantCultureIgnoreCase));
string commonFolderPath = string.Format("{0}{1}"
, root1
, Path.Combine(commonFolders.Skip(1).ToArray())); // Skip(1) skips root
Console.Write(commonFolderPath);
}
Result: C:\Users\Me\FileFolder
Upvotes: 1
Reputation: 12797
Alternative way is to use Zip
with TakeWhile
(suggested by Selman22).
string path1 = @"C:\Users\Me\FileFolder\File1.info";
string path2 = @"C:\Users\Me\FileFolder\DirectoryContent\Content1\File.info";
string[] part1 = path1.Split(Path.DirectorySeparatorChar);
string[] part2 = path2.Split(Path.DirectorySeparatorChar);
string[] commonParts = part1.Zip(part2, (p1, p2) => p1 == p2 ? p1 : null)
.TakeWhile(s => s != null)
.ToArray();
string commonPath = string.Join(Path.DirectorySeparatorChar.ToString(), commonParts);
Slightly changed example of Selman22.
string path1 = @"C:\Users\Me\FileFolder\File1.info";
string path2 = @"C:\Users\Me\FileFolder\DirectoryContent\Content1\File.info";
string[] part1 = path1.Split(Path.DirectorySeparatorChar);
string[] part2 = path2.Split(Path.DirectorySeparatorChar);
string[] commonParts = Enumerable.Range(0, Math.Min(part1.Length, part2.Length))
.TakeWhile(i => part1[i] == part2[i])
.Select(i => part1[i])
.ToArray();
string commonPath = string.Join(Path.DirectorySeparatorChar.ToString(), commonParts);
Upvotes: 0
Reputation: 101681
It can be done using String.Split
method and Enumerable.TakeWhile
var part1 = path1.Split(Path.DirectorySeparatorChar);
var part2 = path2.Split(Path.DirectorySeparatorChar);
var commonParts = part1.TakeWhile((x,idx) => idx < part2.Length && part2[idx] == x);
if (commonParts.Any())
{
var result = string.Join(Path.DirectorySeparatorChar.ToString(), commonParts);
}
Upvotes: 2