C# - исключить каталоги и файлы из Directory.GetDirectories () и Directory.GetFiles () - PullRequest
1 голос
/ 28 февраля 2020

Мне нужно сосчитать файлы и каталоги внутри указанного пути к каталогу. Но я хочу исключить из подсчета папку . 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, но как я могу предотвратить files (присутствует в каталоге. git) подсчитывается?

Насколько мне известно, GetDirectories () работает только с папками, а не с файлами, а GetFiles () работает только с файлы без разницы, какие каталоги исключены GetDirectories ().

Ответы [ 4 ]

1 голос
/ 02 марта 2020

Поскольку MSDN заявляет здесь :

Методы EnumerateFiles и GetFiles отличаются следующим образом: Когда вы используете EnumerateFiles, вы можете начать перечисление коллекции имен до того, как вся коллекция станет вернулся; когда вы используете GetFiles, вы должны подождать, пока весь массив имен будет возвращен, прежде чем вы сможете получить доступ к массиву. Поэтому, когда вы работаете со многими файлами и каталогами, EnumerateFiles может быть более эффективным.

Следовательно, вам лучше сделать что-то вроде следующего:

var directory = new DirectoryInfo(directoryPath);
var filesCount = directory.EnumerateFiles("*.*", SearchOption.AllDirectories).Count(file => !file.DirectoryName.Contains(".git"));
1 голос
/ 28 февраля 2020

вы можете попробовать это решение:

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

Обратите внимание, что это решение позволит вам указать только одну папку для исключения, но ее легко адаптировать для работы с несколькими папками для исключения.

Дайте мне знать, если это будет полезно.

1 голос
/ 28 февраля 2020

что по этому поводу:

    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();
1 голос
/ 28 февраля 2020

Вы можете сделать следующее. Комментарии включены с кодом

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