Search code examples
c#.netwildcardrelative-pathpath-combine

Resolving relative paths with wildcards in C#


In C#, if I have a directory path and a relative file path with wildcard, e.g.

"c:\foo\bar" and "..\blah\*.cpp"

Is there a simple way to get the list of absolute file paths? e.g.

{ "c:\foo\blah\a.cpp", "c:\foo\blah\b.cpp" }

Background

There is a source code tree, where any directory can contain a build definition file. This file uses relative paths with wildcards to specify a list of source files. The task is to generate a list of absolute paths of all source files for each one of these build definition files.


Solution

  • You can get the absolute path first and then enumerate the files inside the directory matching the wildcard:

    // input
    string rootDir = @"c:\foo\bar"; 
    string originalPattern = @"..\blah\*.cpp";
    
    // Get directory and file parts of complete relative pattern
    string pattern = Path.GetFileName (originalPattern); 
    string relDir = originalPattern.Substring ( 0, originalPattern.Length - pattern.Length );
    // Get absolute path (root+relative)
    string absPath = Path.GetFullPath ( Path.Combine ( rootDir ,relDir ) );
    
    // Search files mathing the pattern
    string[] files = Directory.GetFiles ( absPath, pattern, SearchOption.TopDirectoryOnly );