文件名匹配“.. \ ThirdParty \ dlls \ * .dll”

时间:2011-10-01 07:38:31

标签: c# filenames glob

是否有一种简单的方法可以获取一个文件名列表,其中包含文件名模式,包括对父目录的引用?我想要的是"..\ThirdParty\dlls\*.dll"返回像["..\ThirdParty\dlls\one.dll", "..\ThirdParty\dlls\two.dll", ...]

这样的集合

我可以找到几个与匹配文件名相关的问题,包括完整路径,通配符,但在模式中没有任何包含“.. \”的内容。 Directory.GetFiles明确禁止它。

我想要对名称进行的操作是将它们包含在 zip存档中,因此如果有一个可以理解这样的相对路径的zip库,我会更乐意使用它。

模式来自输入文件,它们在编译时是未知的。它们可能变得非常复杂,例如..\src\..\ThirdParty\win32\*.dll因此解析可能不可行。

必须把它放在zip中也是我不太热衷于将模式转换为完整路径的原因,我想要zip中的相对路径。

编辑:我正在寻找的是与/ bin / ls相当的C#。

3 个答案:

答案 0 :(得分:3)

static string[] FindFiles(string path)
{
    string directory = Path.GetDirectoryName(path); // seperate directory i.e. ..\ThirdParty\dlls
    string filePattern = Path.GetFileName(path); // seperate file pattern i.e. *.dll

    // if path only contains pattern then use current directory
    if (String.IsNullOrEmpty(directory))
        directory = Directory.GetCurrentDirectory();

    //uncomment the following line if you need absolute paths
    //directory = Path.GetFullPath(directory); 

    if (!Directory.Exists(directory))      
        return new string[0];

    var files = Directory.GetFiles(directory, filePattern); 
    return files;
}

答案 1 :(得分:3)

Path.GetFullPath()函数将从相对转换为绝对。你可以在路径部分使用它。

string pattern = @"..\src\..\ThirdParty\win32\*.dll";

string relativeDir = Path.GetDirectoryName(pattern);
string absoluteDir = Path.GetFullPath(relativeDir);
string filePattern = Path.GetFileName(pattern);

foreach (string file in Directory.GetFiles(absoluteDir, filePattern))
{

}

答案 2 :(得分:2)

如果我理解正确,你可以将Directory.EnumerateFiles与这样的正则表达式结合使用(我还没有测试过):

var matcher = new Regex(@"^\.\.\\ThirdParty\\dlls\\[^\\]+.dll$");
foreach (var file in Directory.EnumerateFiles("..", "*.dll", SearchOption.AllDirectories)
{
    if (matcher.IsMatch(file))
        yield return file;
}