private bool VisitFile(FileInfo fileInfo, FolderNode rootNode) { if (_searchIsStopped) { return(false); } var file = Map(fileInfo, rootNode); var filterResult = _filterBy == null ? true : _filterBy.Invoke(file); if (filterResult) { var fEvent = new FileNodeFindEvent(file); FileFound?.Invoke(this, fEvent); ProcessEvent(rootNode, file, fEvent); return(fEvent.ShouldBeAdd); } return(false); }
private bool TryToAddChildNodes(FolderNode root, Predicate <FileSystemNode> predicate, LinkedList <FileSystemNode> list) { var isChildAccording = false; foreach (var node in root) { if (_shoudBeStopped) { throw new StopException(); } var predicateResult = predicate(node); switch (node) { case FileNode file: { if (predicateResult) { var ev = new FileNodeFindEvent(file); FilteredFileFound?.Invoke(this, ev); if (ev.ShouldBeAdd) { list.AddLast(file); isChildAccording = true; _shoudBeStopped = ev.StopSearch; } } break; } case FolderNode folder: { var lastNode = list.Last; if (TryToAddChildNodes(folder, predicate, list) || predicateResult) { var ev = new FolderNodeFindEvent(folder); FilteredFolderFound?.Invoke(this, ev); if (ev.ShouldBeAdd) { if (lastNode != null) { list.AddAfter(lastNode, folder); } else if (list.Count > 0) { list.AddFirst(folder); } else { list.AddLast(folder); } isChildAccording = true; _shoudBeStopped = ev.StopSearch; } } } break; } } return(isChildAccording); }