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