Exemplo n.º 1
0
 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);
     }
 }
Exemplo n.º 2
0
        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;
                }
            }
        }