![](/img/trans.png)
[英]C# Recurse Directories using Directory.GetFiles and search pattern
[英]Directory.GetFiles() pattern match in C#
我正在使用Directory.GetFiles()
根据给定的模式列出文件。 这对于我正在寻找的大多数模式(例如zip,rar,sfv)都适用。
这就是我准备列表的方式(或多或少)。 问题是我要列出的.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);
}
然后我打电话
string[] files = Directory.GetFiles(strDirName, varPattern);
对于数组中的每个模式,这样做似乎是一个坏主意,因为列表中有1002个条目,并且检查目录中是否每个条目都有些浪费时间。
会有更好的方法吗?
您应该调用Directory.EnumerateFiles("path", "*")
,然后使用LINQ通过调用Path.GetExtension
来过滤路径。
例如:
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));
我基于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.