DirectoryInfo.GetDirectories()和属性
时间:2020-03-06 14:25:17 来源:igfitidea点击:
我递归地使用" DirectoryInfo.GetDirectories()"来查找给定路径下的所有子目录。
但是,我要排除"系统"文件夹,并且没有明确的方法。
在FindFirstFile / FindNextFile中,使用属性可以使事情变得更清楚。
解决方案
我们可能必须遍历结果,并拒绝那些不需要的属性(使用Attributes属性)。
@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属性
FileAttributes枚举
这是一个很好的例子,其中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);
}

