Directory.GetFiles()searchpattern

时间:2013-04-12 01:30:58

标签: .net regex

我有这个基本代码

Directory.GetFiles(filepath, "*.OUT")

在文件路径中有一个名为Filename.OUT

的文件

上面的代码发现文件正常。

现在,我通过附加一个UniqueID重命名该文件,以便不再获取该文件。

Filename.OUT6F9619FF-8B86-D011-B42D-00C04FC964FF

但是,该文件仍然被Directory.GetFiles()提取!

那么,searchpattern(*.OUT)是一个正则表达式模式吗?如果是这样,这是有道理的。

MSDN上的信息似乎并不意味着它是。如果没有,是否有我可以使用的模式,以便它不被拿起?

3 个答案:

答案 0 :(得分:3)

这是预期的行为,因为在您链接的文档中指出:

  

文件扩展名正好为三个字符的searchPattern将返回扩展名为三个或更多字符的文件,其中前三个字符与searchPattern中指定的文件扩展名匹配。

但相反,它表示:

  

文件扩展名为一,二或三个以上字符的searchPattern仅返回扩展名与searchPattern中指定的文件扩展名完全匹配的文件。

因此,在您的情况下,您将拥有来过滤掉结果。我希望它不同。这对许多人来说都是一个问题,甚至包括我自己。

答案 1 :(得分:3)

在使用文件系统监视器时,我必须自己处理这个问题。添加到MichaelPerrenoud所说的内容您可以通过快速过滤器运行所有匹配,例如:

bool ExtensionOf ( String f, String targetext ) {
    return f.EndsWith( targetext );
}

如果您不需要targetext的灵活性,只需将其完全替换为".OUT"

祝你好运!

答案 2 :(得分:2)

你可以按guid的长度去掉(substring)输入字符串:

string fileName = "Filename.OUT";
string seed = "6F9619FF-8B86-D011-B42D-00C04FC964FF";
string input = fileName + seed;
string result = input.Substring(0, input.Length - seed.Length);
FileInfo file = new FileInfo(result);
Console.WriteLine(file.Extension);

通常使用结果:

private static string StripSeed(string input)
{
    return input.Substring(0, input.Length - 36); // length of seed (guid)
}

Directory.EnumerateFile("*.*")
         .Select(p => StripSeed(p))
         .Select(f => new FileInfo(f))
         .Where(fi => fi.Extesnsion.Equals(".OUT", StringComparison.OrdinalIgnoreCase));

Sandbox.