C# 如何使用Directory.Enumerate文件(不包括隐藏文件和系统文件)

C# 如何使用Directory.Enumerate文件(不包括隐藏文件和系统文件),c#,ienumerable,fileinfo,C#,Ienumerable,Fileinfo,我正在枚举目录中的所有文件,以便以后处理它们。我想排除隐藏文件和系统文件 这就是我到目前为止所做的: IEnumerable<IGrouping<string, string>> files; files = Directory.EnumerateFiles(sourcePath, "*", SearchOption.AllDirectories) .Where(f => (new FileInfo(f).Attributes & FileA

我正在枚举目录中的所有文件,以便以后处理它们。我想排除隐藏文件和系统文件

这就是我到目前为止所做的:

IEnumerable<IGrouping<string, string>> files;

files = Directory.EnumerateFiles(sourcePath, "*", SearchOption.AllDirectories)
       .Where(f => (new FileInfo(f).Attributes & FileAttributes.Hidden & FileAttributes.System) == 0)
       .GroupBy(Path.GetDirectoryName);
我从Jerome那里找到了一个类似的例子,但我甚至无法编译它

我做错了什么

.Where(f => (new FileInfo(f).Attributes & FileAttributes.Hidden & FileAttributes.System) == 0)

由于值是标志,因此它们在位级别上是析取的,因此可以正确组合它们。因此,
FileAttributes.Hidden&FileAttributes.System
将始终为
0
。因此,您基本上是在检查以下内容:

(new FileInfo(f).Attributes & 0) == 0
这将始终是正确的,因为您正在使用
&0
部分删除任何值

您要检查的是文件是否没有这两个标志,或者换句话说,如果没有两个标志的组合的公共标志:

.Where(f => (new FileInfo(f).Attributes & (FileAttributes.Hidden | FileAttributes.System)) == 0)
您还可以使用,使其更易于理解:

.Where(f => !new FileInfo(f).Attributes.HasFlag(FileAttributes.Hidden | FileAttributes.System))
您可以使用:


通过使用DirectoryInfo和FileInfo,您可以大大简化代码,例如:

var mask= FileAttributes.Hidden | FileAttributes.System;

var di=new DirectoryInfo(sourcePath);
var files=di.EnumerateFiles("*", SearchOption.AllDirectories)
            .Where(fi=>(fi.Attributes & mask) == 0)
            .GroupBy(fi=>fi.DirectoryName);
您的原始代码尝试在没有公共位的标志之间执行按位AND,因此返回0。因此,按位和with
属性也返回0


要检查的掩码是系统或隐藏的,即
FileAttributes.Hidden | FileAttributes.System
。提前计算这个值只会使代码变得更干净一些

FileAttributes.Hidden&FileAttributes.System
总是等于0。哦,我没有意识到这一点。我尝试了
(新的FileInfo(f.Attributes&FileAttributes.Hidden)!=FileAttributes.Hidden)
这很管用,但我很难弄清楚如何在其中包含系统文件。此外,如果要创建新的FileInfo,请从DirectoryInfo开始,以便从一开始就获得FileInfo对象。对于过滤器,请尝试
fi.Attributes&(FileAttributes.Hidden | FileAttributes.System))==0
。首先创建所需的掩码
FileAttributes.Hidden | FileAttributes.System
,然后执行按位and。文件夹路径也可以通过
FileInfo.DirectoryName
获得,非常感谢您的解释。将在4分钟内接受;-)在Where子句中,按位&表达式需要用括号括起来,因为==的优先级高于&,即
。其中(fi=>(fi.Attributes&mask)==0)
DirectoryInfo dir = new DirectoryInfo( sourcePath );
var files = dir.EnumerateFiles("*", SearchOption.AllDirectories)
    .Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden) && !f.Attributes.HasFlag(FileAttributes.System))
    .GroupBy(f => f.DirectoryName);
var mask= FileAttributes.Hidden | FileAttributes.System;

var di=new DirectoryInfo(sourcePath);
var files=di.EnumerateFiles("*", SearchOption.AllDirectories)
            .Where(fi=>(fi.Attributes & mask) == 0)
            .GroupBy(fi=>fi.DirectoryName);