使用通配符解析C#中的相对路径

12
在C#中,如果我有一个目录路径和一个带通配符的相对文件路径,例如

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

是否有一种简单的方法来获取绝对文件路径列表?例如:

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

背景

有一个源代码树,其中任何目录都可以包含构建定义文件。此文件使用带通配符的相对路径指定源文件列表。任务是为每个构建定义文件生成所有源文件的绝对路径列表。


System.IO.Directory.EnumerateFiles 允许您在 searchpattern 参数中指定通配符,详情请参见:http://msdn.microsoft.com/en-us/library/dd413233.aspx,并返回绝对路径。 - Polity
@Polity,System.ArgumentException:搜索模式不能包含“..”以向上移动目录。 - NS.X.
2个回答

4

您可以先获取绝对路径,然后枚举目录中与通配符匹配的文件:

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

如果路径包含任何通配符,Path.GetFullPath()会抛出ArgumentException:路径中有非法字符。 - NS.X.
你说得对,我更新了我的代码,使得相对搜索模式首先被分成目录和文件信息,然后再确定绝对路径。 - Stephan Bauer
它可以工作!更好的是,我们可以使用string relDir = Path.GetDirectoryName(originalPattern);而不是string relDir = originalPattern.Substring ( 0, originalPattern.Length - pattern.Length ); - NS.X.
这很有效,但仅适用于在相对路径的目录名称中未使用通配符的情况下,例如问题提供的具体示例。 - sɐunıɔןɐqɐp

3

这很简单。

using System.IO;
      .
      .
      .
string[] files = Directory.GetFiles(@"c:\", "*.txt", SearchOption.TopDirectoryOnly);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接