문제

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?

도움이 되었습니까?

해결책 2

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

다른 팁

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);
}

Fiddle

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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top