DirectoryInfo.GetDirectories() 和属性
-
01-07-2019 - |
题
我在用 DirectoryInfo.GetDirectories()
递归地查找给定路径下的所有子目录。但是,我想排除系统文件夹,但没有明确的方法。在 FindFirstFile/FindNextFile 中,属性的情况更加清晰。
解决方案
@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 链接:
其他提示
这是一个很好的场景示例,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 应用程序,那么您可以使用 林克桥 使您能够访问所有很酷的 Linq to 对象方法(如上面的Where() 和ToArray())。
编辑
在 .net v4 中你会使用 枚举目录 代替 获取目录 它允许您迭代结果,而无需先在内存中构建数组。
public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
this DirectoryInfo directory,
string searchPattern,
SearchOption searchOption)
{
return directory.EnumerateDirectories(searchPattern, searchOption)
.Where(subDir => (subDir.Attributes & FileAttributes.System) == 0);
}
您可能必须循环遍历结果并拒绝那些具有您不想要的属性的结果(使用 Attributes 属性)。
使用终极 Sweet Linq
IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
不隶属于 StackOverflow