获取除隐藏目录中的文件之外的所有文件?

Posted

技术标签:

【中文标题】获取除隐藏目录中的文件之外的所有文件?【英文标题】: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)

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

【问题讨论】:

是否有可能有一个不隐藏在隐藏目录中的文件? 恐怕不要这么认为。虽然它可能不需要那么多代码。 @DimitarTsonev:是的。 C# - Get a list of files excluding those that are hidden的可能重复 【参考方案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);

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

【讨论】:

以上是关于获取除隐藏目录中的文件之外的所有文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在下拉列表中获取除隐藏和提交按钮之外的所有表单字段

如何隐藏所有排除文件类型

JQuery 隐藏除我搜索的 div 之外的所有 div [关闭]

Linux基础命令

如何隐藏所有不包括文件类型的内容

通过 :not 在 jQuery 选择器中隐藏除 $(this) 之外的所有内容