我递归地使用DirectoryInfo.GetDirectories()来查找给定路径下的所有子目录。但是,我想排除系统文件夹,并且没有明确的方法。在FindFirstFile/FindNextFile中,属性更加清晰。
发布于 2008-09-19 09:51:44
@rslite是对的,.NET没有提供这种开箱即用的过滤,但它并不难实现:
static IEnumerable<string> GetNonSystemDirs(string path)
{
var dirs = from d in Directory.GetDirectories(path)
let inf = new DirectoryInfo(d)
where (inf.Attributes & FileAttributes.System) == 0
select d;
foreach (var dir in dirs)
{
yield return dir;
foreach (var subDir in GetNonSystemDirs(dir))
{
yield return subDir;
}
}
}MSDN链接:
FileSystemInfo.Attributes Property
FileAttributes Enumeration
发布于 2008-09-19 10:07:49
这是一个很好的场景示例,在这种场景中,Linq和扩展方法让事情变得非常干净和简单。
public static DirectoryInfo[] GetNonSystemDirectories(
this DirectoryInfo directory,
string searchPattern,
SearchOption searchOption)
{
return directory.GetDirectories(searchPattern, searchOption)
.Where(subDir => (subDir.Attributes & FileAttributes.System) == 0)
.ToArray();
}如果您正在构建一个.net v2应用程序,那么您可以使用LinqBridge来访问所有很酷的Linq to objects方法(比如上面的Where()和ToArray() )。
编辑
在.net v4中,您应该使用EnumerateDirectories而不是GetDirectories,这允许您迭代结果,而无需首先在内存中构建数组。
public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
this DirectoryInfo directory,
string searchPattern,
SearchOption searchOption)
{
return directory.EnumerateDirectories(searchPattern, searchOption)
.Where(subDir => (subDir.Attributes & FileAttributes.System) == 0);
}发布于 2008-09-19 09:37:33
您可能必须遍历结果并拒绝那些具有不需要的属性的结果(使用attributes属性)。
https://stackoverflow.com/questions/100721
复制相似问题