我正在枚举目录中的所有文件,以便稍后处理它们。我想排除隐藏文件和系统文件。
这是我到目前为止所拥有的:
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);
但是,如果我查看结果,我仍然被隐藏并包含系统文件:
foreach (var folder in files)
{
foreach (var file in folder)
{
// value for file here still shows hidden/system file paths
}
}
I found 这个问题 https://stackoverflow.com/questions/2418270/c-sharp-get-a-list-of-files-excluding-those-that-are-hiddenJerome 有一个类似的例子,但我什至无法编译它。
我究竟做错了什么?
.Where(f => (new FileInfo(f).Attributes & FileAttributes.Hidden & FileAttributes.System) == 0)
Since FileAttributes https://msdn.microsoft.com/en-us/library/system.io.fileattributes.aspx值是标志,它们在位级别上是分离的,因此您可以正确组合它们。像这样,FileAttributes.Hidden & FileAttributes.System
一直会0
。因此,您实际上是在检查以下内容:
(new FileInfo(f).Attributes & 0) == 0
这将永远是正确的,因为您正在使用& 0
part.
您要检查的是文件是否没有这些标志,或者换句话说,是否不存在具有两者组合的公共标志:
.Where(f => (new FileInfo(f).Attributes & (FileAttributes.Hidden | FileAttributes.System)) == 0)
您还可以使用Enum.HasFlag https://msdn.microsoft.com/en-us/library/system.enum.hasflag.aspx为了更好地理解这一点:
.Where(f => !new FileInfo(f).Attributes.HasFlag(FileAttributes.Hidden | FileAttributes.System))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)