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