コード例 #1
0
        public IEnumerable <string> GetFiles(string folder)
        {
            // The method has not made a recursive call yet.
            if (_counter == 0)
            {
                OnSearchStarted(EventArgs.Empty);
            }

            _counter++;

            IEnumerable <string> files = null;

            try
            {
                files = Directory.GetFileSystemEntries(folder);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw;
            }

            foreach (var file in files)
            {
                var isDirectory = Directory.Exists(file);
                var eventArgs   = new FileEntryReachedEventArgs(file, DateTime.Now, _cancellationTokenSource);
                var isFiltered  = FilterFileEntryDel?.Invoke(file) == true;

                if (_cancellationTokenSource.Token.IsCancellationRequested)
                {
                    Console.WriteLine("The search has been terminated.");
                    break;
                }

                if (isDirectory)
                {
                    OnDirectoryFound(eventArgs);
                }

                if (!isDirectory)
                {
                    OnFileFound(eventArgs);
                }

                // Fire a corresponding event to every file that was filtered.
                if (isFiltered && isDirectory)
                {
                    OnFilteredDirectoryFound(eventArgs);
                }

                if (isFiltered && !isDirectory)
                {
                    OnFilteredFileFound(eventArgs);
                }

                if (isFiltered && isDirectory)
                {
                    foreach (var f in GetFiles(file))
                    {
                        yield return(f);
                    }
                }

                if (eventArgs.Exclude)
                {
                    Console.WriteLine("File {0} was excluded.", file);
                    continue;
                }
                else
                {
                    yield return(file);
                }
            }

            _counter--;

            // All recursive calls have been executed.
            if (_counter == 0)
            {
                OnSearchFinished(EventArgs.Empty);
            }
        }
コード例 #2
0
        protected virtual void OnFilteredDirectoryFound(FileEntryReachedEventArgs e)
        {
            EventHandler <FileEntryReachedEventArgs> handler = FilteredDirectoryFound;

            handler?.Invoke(this, e);
        }