简体   繁体   English

C#中的Directory.GetFiles()模式匹配

[英]Directory.GetFiles() pattern match in C#

I'm using Directory.GetFiles() to list files according to given pattern. 我正在使用Directory.GetFiles()根据给定的模式列出文件。 This works fine for most of patterns I'm looking for (eg zip, rar, sfv). 这对于我正在寻找的大多数模式(例如zip,rar,sfv)都适用。

This is how I prepare the list (more or less). 这就是我准备列表的方式(或多或少)。 The problem is with pattern of numbers .001 to .999 that I want to list. 问题是我要列出的.001至.999的数字模式。

alArrayPatternText.Add("*.zip");
alArrayPatternText.Add("*.sfv");
alArrayPatternText.Add("*.r??");
alArrayPatternText.Add("*.001");
for (int i = 2; i <= 999; i++)
{
    string findNumber = String.Format("{0:000}", i);
    alArrayPatternText.Add("*." + findNumber);
}

I then call 然后我打电话

string[] files = Directory.GetFiles(strDirName, varPattern);

for each pattern in the Array which seems like very bad idea to do so since the list has 1002 entries and checking if directory has each of them is just a bit too time consuming. 对于数组中的每个模式,这样做似乎是一个坏主意,因为列表中有1002个条目,并且检查目录中是否每个条目都有些浪费时间。

Would there be a better way to do so ? 会有更好的方法吗?

You should call Directory.EnumerateFiles("path", "*") and then use LINQ to filter the paths by calling Path.GetExtension . 您应该调用Directory.EnumerateFiles("path", "*") ,然后使用LINQ通过调用Path.GetExtension来过滤路径。

For example: 例如:

var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {
    ".zip", ".sfv"
};
extensions.UnionWith(Enumerable.Range(1, 998).Select(i => i.ToString(".000")));
var files = Directory.EnumerateFiles("path", "*")
            .Where(p => extensions.Contains(Path.GetExtension(p))
                     || Path.GetExtension(p).StartsWith(".r", StringComparison.OrdinalIgnoreCase));

My final method based on SLaks answer for anyone looking for similar solution 我基于SLaks的最终方法可以为任何寻求类似解决方案的人提供答案

private static IEnumerable<string> DirectoryGetFiles(string strDirName, SearchOption varOption) {
var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ".zip", ".sfv" };
     extensions.UnionWith(Enumerable.Range(1, 999).Select(i => String.Format(".{0:000}", i)));
     extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".r{0:00}", i)));
     extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".s{0:00}", i)));
     extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".t{0:00}", i)));
     return Directory.EnumerateFiles(strDirName, "*.*", varOption).Where(p => extensions.Contains(Path.GetExtension(p))).ToList();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM