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); } }
protected virtual void OnFilteredDirectoryFound(FileEntryReachedEventArgs e) { EventHandler <FileEntryReachedEventArgs> handler = FilteredDirectoryFound; handler?.Invoke(this, e); }