【发布时间】:2010-09-23 06:13:50
【问题描述】:
可能重复:
Can you call Directory.GetFiles() with multiple filters?
是否有可能获得前任。 <em>.c</em> 和 .h目录中的文件。 Directory.GetFiles("C:\", "<em>.c;</em>.h"); 的使用不起作用。两次调用Directory.GetFiles(...); 太糟糕了.. :(
谢谢。
【问题讨论】:
可能重复:
Can you call Directory.GetFiles() with multiple filters?
是否有可能获得前任。 <em>.c</em> 和 .h目录中的文件。 Directory.GetFiles("C:\", "<em>.c;</em>.h"); 的使用不起作用。两次调用Directory.GetFiles(...); 太糟糕了.. :(
谢谢。
【问题讨论】:
如果您使用的是 .NET 4.0,我会选择 Directory.EnumerateFiles:
var files = from f in Directory.EnumerateFiles("C:\\")
where f.EndsWith(".c") || f.EndsWith(".h")
select f;
【讨论】:
Directory.EnumerateFiles()。将其更改为Directory.GetFiles(),它应该可以正常工作。
GetFiles() 来规避填充(可能)巨大的string[] 数组的成本。跨度>
GetFiles() 便宜(内存方面),并且会立即开始返回值(无需先获取所有文件)。但你是对的;从接受的答案来看,实际上,OP似乎并不太关心这一点。
不可能在单个 GetFiles() 方法调用中指定多个过滤器。你可以找到替代品here
【讨论】:
你可以试试这样的:
var query = from p in Directory.GetFiles(@"C:\").AsEnumerable()
where p.Contains(".c")
|| p.Contains(".h")
select p;
【讨论】:
对于 .Net 3.5。
public IEnumerable<string> GetFiles(
string basePath,
params string[] searchPatterns)
{
if (searchPatterns == null || searchPatterns.Length == 0)
{
return Directory.GetFiles(basePath);
}
return Enumerable.SelectMany(searchPatterns,
p => Directory.GetFiles(basePath, p));
}
用法:
GetFiles(@"c:\", "*.c", "*.h");
您可能想要添加一些验证
【讨论】:
【讨论】:
这里有一些有用的辅助函数来模拟多个过滤器:
// .NET 4.0 friendly
public static IEnumerable<string> EnumerateFiles(string path, params string[] filters)
{
return filters.Length == 0
? Directory.EnumerateFiles(path)
: filters.SelectMany(filter => Directory.EnumerateFiles(path, filter));
}
// .NET 3.5 friendly
public static IEnumerable<string> GetFiles(string path, params string[] filters)
{
return filters.Length == 0
? Directory.GetFiles(path)
: filters.SelectMany(filter => Directory.GetFiles(path, filter));
}
【讨论】: