C# C中的Directory.GetFiles()模式匹配#
我正在使用C# C中的Directory.GetFiles()模式匹配#,c#,c#-4.0,directory-listing,C#,C# 4.0,Directory Listing,我正在使用Directory.GetFiles()根据给定的模式列出文件。这适用于我正在寻找的大多数模式(例如zip、rar、sfv) 这就是我准备清单的方式(或多或少)。问题在于我想列出的.001到.999的数字模式 alArrayPatternText.Add("*.zip"); alArrayPatternText.Add("*.sfv"); alArrayPatternText.Add("*.r??"); alArrayPatternText.Add("*.001"); for (int
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);
}
对于数组中的每个模式,这样做似乎是非常糟糕的,因为列表中有1002个条目,而检查目录中是否有每个条目是有点太耗时了
有更好的方法吗?您应该调用
目录.EnumerateFiles(“path”,“*”)
,然后使用LINQ通过调用路径.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));
var extensions=newhashset(StringComparer.OrdinalIgnoreCase){
.zip“,.sfv”
};
UnionWith(Enumerable.Range(1998).Select(i=>i.ToString(.000));
var files=目录.枚举文件(“路径”,“*”)
.Where(p=>extensions.Contains(Path.GetExtension(p))
||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();
}
private static IEnumerable DirectoryGetFiles(字符串strDirName,SearchOption varOption){
var extensions=newhashset(StringComparer.OrdinalIgnoreCase){.zip',.sfv};
UnionWith(Enumerable.Range(1999).Select(i=>String.Format(“.{0:000}”,i));
UnionWith(Enumerable.Range(1,99).Select(i=>String.Format(“.r{0:00}”,i));
UnionWith(Enumerable.Range(1,99).Select(i=>String.Format(“.s{0:00}”,i));
UnionWith(Enumerable.Range(1,99).Select(i=>String.Format(“.t{0:00}”,i));
返回Directory.EnumerateFiles(strDirName,“**”,varOption).Where(p=>extensions.Contains(Path.GetExtension(p)).ToList();
}
谢谢,应该可以:-)Hrmms,似乎有什么问题,000-999不能很好地转换。它显示为1000 2000等,即使dir有zip文件,001也不会返回任何文件..:/可能是字符串格式问题。尝试将:i=>i.ToString(“.000”)替换为:i=>”+iYes,这是字符串格式问题,但我将其替换为i=>string.format(“.{0:000}”,i)
,结果是:-)
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();
}