【问题标题】:C# - Exclude directories and files from Directory.GetDirectories() and Directory.GetFiles()C# - 从 Directory.GetDirectories() 和 Directory.GetFiles() 中排除目录和文件
【发布时间】:2020-06-12 07:28:07
【问题描述】:

我需要计算指定目录路径中的文件和目录。但我想排除 .git 文件夹和该文件夹内的文件不被计算在内。我试过了——

int maxCount = Directory.GetFiles(loadedDirectoryPath, "*.*", SearchOption.AllDirectories).Length + Directory.GetDirectories(loadedDirectoryPath, "*.*", SearchOption.AllDirectories).Length;

为了排除.git,我可以写-

Directory.GetDirectories(loadedDirectoryPath, "*.*", SearchOption.AllDirectories).Where(item => !item.EndsWith(".git")).ToArray().Length;

这将排除 .git 目录,但是如何防止 文件(存在于 .git 目录中)被计算在内?

据我所知,GetDirectories() 只处理文件夹而不处理文件,GetFiles() 只处理文件,而不关心 GetDirectories() 排除的目录。

【问题讨论】:

  • 检查“项目”到底是什么,并适当地更新 Where 条件。
  • 这些方法中没有任何内容可以为您进行过滤。您必须在结果中过滤掉任何您不想要的路径,您将不得不多次调用才能只获取您想要的文件夹/文件。

标签: c# file-io getfiles getdirectories


【解决方案1】:

这个呢:

    var all = Directory.GetFileSystemEntries(path, "*.*",SearchOption.AllDirectories);
    var allCount = all.Count();
    var noGit = all.Where(p =>  !p.Contains(@"\.git\") && !p.EndsWith(@"\.git")).ToArray();
    var noGitCount = noGit.Count();

【讨论】:

    【解决方案2】:

    您可以执行以下操作。代码中包含的注释

    // List of Folders to be ignore, .git ones
    var foldersToIgnore = Directory.GetDirectories(path,".git",SearchOption.AllDirectories);
    // list of files, excludes ones in .git folder
    var files = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
                 .Where(x=>!foldersToIgnore.Any(c=>x.StartsWith(c)));
    var directories = Directory.GetDirectories(path, "*.*", SearchOption.AllDirectories)
                 .Where(x=>!foldersToIgnore.Any(c=>x.StartsWith(c)));
    // Count
    var maxCount = files.Count() + directories.Count();
    

    【讨论】:

      【解决方案3】:

      你可以试试这个解决方案:

      var pathToIgnore = loadedDirectoryPath + ".git";
      int count =
          Directory.GetFiles(loadedDirectoryPath, "*.*", SearchOption.AllDirectories).Where(d => !d.StartsWith(pathToIgnore))
          .Concat(Directory.GetDirectories(loadedDirectoryPath, "*.*", SearchOption.AllDirectories).Where(d => !d.StartsWith(pathToIgnore)))
          .ToArray()
          .Count();
      

      请注意,此解决方案仅允许您指定要排除的一个文件夹,但将其调整为适用于要排除的多个文件夹是微不足道的。

      让我知道它是否有用。

      【讨论】:

        【解决方案4】:

        正如 MSDN 所说的here

        EnumerateFiles 和 GetFiles 方法的区别如下: 使用 EnumerateFiles 时,可以在返回整个集合之前开始枚举名称集合;当您使用 GetFiles 时,您必须等待返回整个名称数组,然后才能访问该数组。因此,当您处理许多文件和目录时,EnumerateFiles 会更高效。

        因此,您应该通过以下方式获得更好的结果:

        var directory = new DirectoryInfo(directoryPath);
        var filesCount = directory.EnumerateFiles("*.*", SearchOption.AllDirectories).Count(file => !file.DirectoryName.Contains(".git"));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-31
          • 2020-03-21
          • 2012-04-08
          • 1970-01-01
          • 1970-01-01
          • 2013-06-06
          • 1970-01-01
          • 2013-02-24
          相关资源
          最近更新 更多