.net DirectoryInfo.getDirectory()和属性

.net DirectoryInfo.getDirectory()和属性,.net,file-io,attributes,directoryinfo,getdirectories,.net,File Io,Attributes,Directoryinfo,Getdirectories,我正在递归地使用DirectoryInfo.GetDirectories()查找给定路径下的所有子目录。 但是,我想排除系统文件夹,没有明确的方法。 在FindFirstFile/FindNextFile中,属性更清晰。您可能必须循环搜索结果并拒绝那些不需要属性的结果(使用attributes属性)。@rslite是正确的,.NET没有提供这种现成的筛选,但实现起来并不困难: static IEnumerable<string> GetNonSystemDirs(string pat

我正在递归地使用
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;
        }
    }
}
静态IEnumerable GetNonSystemDirs(字符串路径)
{
var dirs=来自Directory.GetDirectories(path)中的d
let inf=新目录信息(d)
其中(inf.Attributes&FileAttributes.System)==0
选择d;
foreach(目录中的var dir)
{
收益回报率;
foreach(GetNonSystemDirs(dir)中的var 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();
}
如果您正在构建一个.NETV2应用程序,那么您可以使用来访问所有很酷的LINQtoObjects方法(如上面的Where()和ToArray())

编辑

在.NETV4中,您将使用而不是,它允许您在不首先在内存中构建数组的情况下迭代结果

public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
    this DirectoryInfo directory,
    string searchPattern,
    SearchOption searchOption)
{
    return directory.EnumerateDirectories(searchPattern, searchOption)
        .Where(subDir => (subDir.Attributes & FileAttributes.System) == 0);
}
公共静态IEnumerable枚举非系统目录(
这是DirectoryInfo目录,
字符串搜索模式,
搜索选项(搜索选项)
{
返回目录。枚举目录(searchPattern,searchOption)
其中(subDir=>(subDir.Attributes&FileAttributes.System)==0);
}

使用极致甜美的Linq

 IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
IEnumerable directories=new DirectoryInfo(path).GetDirectories()。其中(a=>(a.Attributes&FileAttributes.System)==0)。选择(a=>a.FullName);

Directory.GetDirectories返回字符串,如何从中获取属性?:)@aku我使用的是DirectoryInfo.GetDirectories实例方法,而不是Directory.GetDirectories静态方法。效率/可用性不如使用yield-return创建真正的递归迭代器。在大目录层次结构上使用SearchOption.AllDirectories不是很好。