6

我正在使用DirectoryInfo.GetDirectories()递归查找给定路径下的所有子目录。但是,我想排除系统文件夹,并且没有明确的方法。在 FindFirstFile/FindNextFile 中,属性更清晰。

4

4 回答 4

8

@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 属性

文件属性枚举

于 2008-09-19T09:51:44.160 回答
3

这是一个很好的例子,说明 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-19T10:07:48.770 回答
0

您可能必须遍历结果并拒绝那些具有您不想要的属性的结果(使用 Attributes 属性)。

于 2008-09-19T09:37:33.273 回答
0

使用终极 Sweet Linq

 IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
于 2014-03-10T01:53:22.793 回答