【问题标题】:Get all files except files in hidden directories?获取除隐藏目录中的文件之外的所有文件?
【发布时间】:2015-08-14 16:58:45
【问题描述】:

我想创建一个目录中所有文件的列表,除了目录中隐藏文件夹中的隐藏文件和文件。我用了这个方法,

new DirectoryInfo(path).GetFiles("*.*", SearchOption.AllDirectories)
                     .Where(f => (f.Attributes & FileAttributes.Hidden) == 0)

但上述方法返回隐藏文件夹内的文件。有没有其他方法可以在不递归遍历目录的情况下做到这一点?

【问题讨论】:

标签: c#


【解决方案1】:

那是因为隐藏子文件夹中的文件没有被隐藏。 要检查这一点,您必须递归地走到每个文件夹并检查文件夹属性。

示例函数:

   private static IList<FileInfo> getNonHidden(DirectoryInfo baseDirectory)
    {
        var fileInfos = new List<System.IO.FileInfo>();
        fileInfos.AddRange(baseDirectory.GetFiles("*.*", SearchOption.TopDirectoryOnly).Where(w => (w.Attributes & FileAttributes.Hidden) == 0));
        foreach (var directory in baseDirectory.GetDirectories("*.*", SearchOption.TopDirectoryOnly).Where(w => (w.Attributes & FileAttributes.Hidden) == 0))
            fileInfos.AddRange(getNonHiddenFiles(directory));

        return fileInfos;
    }

使用方法:

  var path = @"c:\temp\123";
  var result = getNonHidden(new DirectoryInfo(path));

【讨论】:

    【解决方案2】:

    没有“手动迭代”的一种方法如下:

    var dirInfo = new DirectoryInfo(path);
    var hiddenFolders = dirInfo.GetDirectories("*", SearchOption.AllDirectories)
        .Where(d => (d.Attributes & FileAttributes.Hidden) != 0)
        .Select(d => d.FullName);
    
    var files = dirInfo.GetFiles("*.*", SearchOption.AllDirectories)
        .Where(f => (f.Attributes & FileAttributes.Hidden) == 0 && 
            !hiddenFolders.Any(d => f.FullName.StartsWith(d)));
    

    但是这将迭代整个目录树两次,并且每个文件都有.Any-overhead => 使用@Catburry 的解决方案,因为它具有更好的性能并且更易于维护 IMO。 ..

    【讨论】:

      【解决方案3】:

      试试这样:

      foreach (DirectoryInfo Dir in Directory.GetDirectories(directorypath))
      {
          if (!Dir.Attributes.HasFlag(FileAttributes.Hidden))
          {
      
          }
      }
      

      【讨论】:

        【解决方案4】:

        你能试试下面的代码吗:

        var x = new DirectoryInfo(@"D://Priyank Sheth/Projects/").GetFiles("*.*", SearchOption.AllDirectories)
                             .Where(f => (f.Directory.Attributes & FileAttributes.Hidden) == 0 && (f.Attributes & FileAttributes.Hidden) == 0);
        

        我没有尝试过,但如果它不起作用,请告诉我。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-28
          • 2011-05-18
          • 1970-01-01
          • 1970-01-01
          • 2018-05-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多