1

我需要计算指定目录路径中的文件和目录。但我想排除.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() 排除的目录。

4

4 回答 4

1

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

// 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();
于 2020-02-28T08:19:35.090 回答
1

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

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();

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

让我知道它是否有用。

于 2020-02-28T08:39:52.500 回答
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();
于 2020-02-28T09:38:45.793 回答
1

正如 MSDN在这里所说:

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

因此,您应该通过执行以下操作来获得更好的效果:

var directory = new DirectoryInfo(directoryPath);
var filesCount = directory.EnumerateFiles("*.*", SearchOption.AllDirectories).Count(file => !file.DirectoryName.Contains(".git"));
于 2020-03-02T10:21:26.827 回答