예제 #1
0
        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);
        }
예제 #2
0
        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);
        }