public static void Delete( FileSystemFinderResult result, bool contentOnly = false, bool includingBom = false, bool filesOnly = false, bool directoriesOnly = false) { if (result.IsDirectory) { DeleteDirectory(result.Path, contentOnly: contentOnly, filesOnly: filesOnly, directoriesOnly: directoriesOnly); } else { DeleteFile(result.Path, contentOnly: contentOnly, includingBom: includingBom); } }
public static IEnumerable <FileSystemFinderResult> Find( string directoryPath, Filter nameFilter = null, Filter extensionFilter = null, Filter directoryFilter = null, FileSystemFinderOptions options = null, IProgress <FileSystemFinderProgress> progress = null, INotifyDirectoryChanged notifyDirectoryChanged = null, CancellationToken cancellationToken = default) { if (options == null) { options = FileSystemFinderOptions.Default; } var enumerationOptions = new EnumerationOptions() { AttributesToSkip = options.AttributesToSkip, IgnoreInaccessible = options.IgnoreInaccessible, MatchCasing = options.MatchCasing, MatchType = options.MatchType, RecurseSubdirectories = false, ReturnSpecialDirectories = options.ReturnSpecialDirectories }; NamePartKind namePart = nameFilter?.NamePart ?? NamePartKind.Name; NamePartKind directoryNamePart = directoryFilter?.NamePart ?? NamePartKind.Name; var directories = new Queue <Directory>(); Queue <Directory> subdirectories = (options.RecurseSubdirectories) ? new Queue <Directory>() : null; string currentDirectory = null; if (notifyDirectoryChanged != null) { notifyDirectoryChanged.DirectoryChanged += (object sender, DirectoryChangedEventArgs e) => currentDirectory = e.NewName; } bool?isMatch = (directoryFilter?.IsNegative == false) ? directoryFilter.IsMatch(NamePart.FromDirectory(directoryPath, directoryNamePart)) : default(bool?); var directory = new Directory(directoryPath, isMatch); while (true) { progress?.Report(new FileSystemFinderProgress(directory.Path, ProgressKind.SearchedDirectory)); if (options.SearchTarget != SearchTarget.Directories && directory.IsMatch != false) { IEnumerator <string> fi = null; try { fi = (options.CanEnumerate) ? EnumerateFiles(directory.Path, enumerationOptions).GetEnumerator() : ((IEnumerable <string>)GetFiles(directory.Path, enumerationOptions)).GetEnumerator(); } catch (Exception ex) when(IsWellKnownException(ex)) { progress?.Report(new FileSystemFinderProgress(directory.Path, ProgressKind.SearchedDirectory, ex)); } if (fi != null) { using (fi) { while (fi.MoveNext()) { FileSystemFinderResult result = MatchFile(fi.Current, nameFilter, extensionFilter, options, progress, namePart); if (result != null) { yield return(result); } cancellationToken.ThrowIfCancellationRequested(); } } } } IEnumerator <string> di = null; try { di = (options.CanEnumerate) ? EnumerateDirectories(directory.Path, enumerationOptions).GetEnumerator() : ((IEnumerable <string>)GetDirectories(directory.Path, enumerationOptions)).GetEnumerator(); } catch (Exception ex) when(IsWellKnownException(ex)) { progress?.Report(new FileSystemFinderProgress(directory.Path, ProgressKind.SearchedDirectory, ex)); } if (di != null) { using (di) { while (di.MoveNext()) { currentDirectory = di.Current; isMatch = (directory.IsMatch == true) ? true : default(bool?); if (directory.IsMatch != false && options.SearchTarget != SearchTarget.Files && namePart != NamePartKind.Extension) { if (isMatch == null) { isMatch = directoryFilter?.IsMatch(NamePart.FromDirectory(currentDirectory, directoryNamePart)); } if (isMatch != false) { FileSystemFinderResult result = MatchDirectory(currentDirectory, nameFilter, options, progress); if (result != null) { yield return(result); } } } if (currentDirectory != null && options.RecurseSubdirectories) { if (isMatch == null) { isMatch = directoryFilter?.IsMatch(NamePart.FromDirectory(currentDirectory, directoryNamePart)); } if (isMatch != false || !directoryFilter !.IsNegative) { subdirectories !.Enqueue(new Directory(currentDirectory, isMatch)); } } cancellationToken.ThrowIfCancellationRequested(); } } if (options.RecurseSubdirectories) { while (subdirectories !.Count > 0) { directories.Enqueue(subdirectories.Dequeue()); } } } if (directories.Count > 0) { directory = directories.Dequeue(); } else { break; } } }