Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的Directory.GetFiles()模式匹配#_C#_C# 4.0_Directory Listing - Fatal编程技术网

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();
}