C# DirectoryInfo().GetFileSystemInfo()-如何避免隐藏文件夹?

C# DirectoryInfo().GetFileSystemInfo()-如何避免隐藏文件夹?,c#,filesysteminfo,C#,Filesysteminfo,如果我这样做: var entries = new DirectoryInfo(@"C:\Folder1") .GetFileSystemInfos("test*", SearchOption.AllDirectories); 当我有这样的文件夹结构时,“HiddenFolder”是隐藏的,但“test.txt”文件不是隐藏的: C:\Folder1\ C:\Folder1\HiddenFolder\ C:\Folder1\HiddenFolder\tes

如果我这样做:

var entries = new DirectoryInfo(@"C:\Folder1")
                   .GetFileSystemInfos("test*", SearchOption.AllDirectories);
当我有这样的文件夹结构时,“HiddenFolder”是隐藏的,但“test.txt”文件不是隐藏的:

C:\Folder1\
C:\Folder1\HiddenFolder\
C:\Folder1\HiddenFolder\test.txt
那么,我如何编写代码以不获取“test.txt”文件呢

(您可能认为GetFileSystemInfo会跳过隐藏文件夹,但事实并非如此。)

这是一个局部解决方案 这段代码去掉隐藏的文件和文件夹,但不处理隐藏文件夹中的非隐藏文件

  var includeLocalFolderNames = true; // to include folder names in the list

  var hiddenFolders = new List<FileSystemInfo>();
  return entries
    .Where(entry =>
      {
        // skip if this entry is hidden, or it is in a hidden folder

        var isHidden = (entry.Attributes & FileAttributes.Hidden) != 0;
        if (isHidden)
        {
          hiddenFolders.Add(entry);
          return false;
        }
        return !hiddenFolders.Any(fsi => entry.FullName.StartsWith(fsi.FullName));
      })
    .Where(entry =>
      {
        // include folder names if requested...

        if (includeLocalFolderNames) return true;
        return (entry.Attributes & FileAttributes.Directory) == 0;
      })
    .Select(entry => {
        // do something...
        return entry.Name;
      });
var includeLocalFolderNames=true;//将文件夹名称包括在列表中的步骤
var hiddenFolders=新列表();
返回条目
.其中(条目=>
{
//如果此条目已隐藏或位于隐藏文件夹中,请跳过
var ishiden=(entry.Attributes和FileAttributes.Hidden)!=0;
如果(isHidden)
{
添加(条目);
返回false;
}
return!hiddenFolders.Any(fsi=>entry.FullName.StartsWith(fsi.FullName));
})
.其中(条目=>
{
//如果需要,请包括文件夹名称。。。
if(includeLocalFolderNames)返回true;
返回(entry.Attributes和FileAttributes.Directory)==0;
})
.选择(条目=>{
//做点什么。。。
返回条目。名称;
});

当然不是最理想和/或最优雅的解决方案

var root = new DirectoryInfo(path);
var nonHiddenDirectories =
    root.GetDirectories("*", SearchOption.AllDirectories).Where(
        d => (d.Attributes & FileAttributes.Hidden) == 0).ToArray();
var nonHiddenFiles =
    nonHiddenDirectories.SelectMany(d => d.GetFiles()).Where(
        f => (f.Attributes & FileAttributes.Hidden) == 0);