private void Match(DirectoryInfoBase directory, string parentRelativePath) { // Request all the including and excluding patterns to push current directory onto their status stack. PushDirectory(directory); Declare(); var entities = new List <FileSystemInfoBase>(); if (_declaredWildcardPathSegment || _declaredLiteralFileSegments.Any()) { entities.AddRange(directory.EnumerateFileSystemInfos()); } else { IEnumerable <DirectoryInfoBase> candidates = directory.EnumerateFileSystemInfos().OfType <DirectoryInfoBase>(); foreach (DirectoryInfoBase candidate in candidates) { if (_declaredLiteralFolderSegmentInString.Contains(candidate.Name)) { entities.Add(candidate); } } } if (_declaredParentPathSegment) { entities.Add(directory.GetDirectory("..")); } // collect files and sub directories var subDirectories = new List <DirectoryInfoBase>(); foreach (FileSystemInfoBase entity in entities) { var fileInfo = entity as FileInfoBase; if (fileInfo != null) { PatternTestResult result = MatchPatternContexts(fileInfo, (pattern, file) => pattern.Test(file)); if (result.IsSuccessful) { _files.Add(new FilePatternMatch( path: CombinePath(parentRelativePath, fileInfo.Name), stem: result.Stem)); } continue; } var directoryInfo = entity as DirectoryInfoBase; if (directoryInfo != null) { if (MatchPatternContexts(directoryInfo, (pattern, dir) => pattern.Test(dir))) { subDirectories.Add(directoryInfo); } continue; } } // Matches the sub directories recursively foreach (DirectoryInfoBase subDir in subDirectories) { string relativePath = CombinePath(parentRelativePath, subDir.Name); Match(subDir, relativePath); } // Request all the including and excluding patterns to pop their status stack. PopDirectory(); }