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