Esempio n. 1
0
        private void StartSearchTask()
        {
            SearchState = SearchState.Searching;

            SearchTask_CancellationTs = new CancellationTokenSource();
            SearchTask = Task.Factory.StartNew(() =>
            {
                SearchState searchState = SearchState.None;

                try
                {
                    searchState = Search();
                }
                catch
                {
                }
                finally
                {
                    this.BeginInvoke(() =>
                    {
                        SearchStopwatch.Stop();
                        UpdateSearchStatisticsTimer.Stop();

                        SearchState = searchState;

                        if (SearchState == SearchState.Stopped)
                        {
                            txtSearchStateShort.Text  = "Search Stopped";
                            txtSearchStateVerbus.Text = "Search Stopped.";
                        }
                        else if (SearchState == SearchState.Canceled)
                        {
                            txtSearchStateShort.Text  = "Search Canceled";
                            txtSearchStateVerbus.Text = "Search Canceled.";
                        }
                        else if (SearchState == SearchState.Completed)
                        {
                            txtSearchStateShort.Text  = "Search Completed";
                            txtSearchStateVerbus.Text = "Search Completed.";
                        }
                        else
                        {
                            txtSearchStateShort.Text  = "Search (" + SearchState + ") ???.";
                            txtSearchStateVerbus.Text = "Search (" + SearchState + ") ???.";
                        }

                        SearchTask_CancellationTs.Dispose();
                        SearchTask_CancellationTs = null;

                        UpdateSearchStatistics();
                        SetButtonIdleState();

                        ColumnChecked.ReadOnly = false;
                    });
                }
            },
                                               SearchTask_CancellationTs.Token,
                                               TaskCreationOptions.LongRunning,
                                               TaskScheduler.Default);
        }
Esempio n. 2
0
        SearchState Search()
        {
            string parentFolder = null;

            string[] searchPatterns     = null; // Holds the search patterns in an array.
            bool     matchCase          = true;
            bool     matchWholeFileName = true;
            bool     searchFiles        = true;
            bool     searchFolders      = true;
            string   folder             = "";

            SearchState searchState = SearchState.None;

            this.Invoke(() =>
            {
                UpdateSearchStatistics();

                parentFolder = txtParentFolderName.Text;
                // The searchPattern can hold multiple search patterns separated by a "|".
                searchPatterns     = txtSearchPattern.Text.Split('|');
                matchCase          = cbMatchCase.Checked;
                matchWholeFileName = cbMatchWholeFileName.Checked;
                searchFiles        = cbSearchFiles.Checked;
                searchFolders      = cbSearchFolders.Checked;

                if (!Directory.Exists(parentFolder))
                {
                    MessageBox.Show(
                        this,
                        string.Format("The directory {0} dos not exist!", parentFolder),
                        AppMsgBoxCaption);

                    searchState = SearchState.Canceled;
                    return;
                }

                if (searchPatterns.Length == 0 || searchPatterns[0] == string.Empty)
                {
                    if (matchWholeFileName)
                    {
                        MessageBox.Show(
                            this,
                            "'File name' is empty and 'Match whole name' is checked,\n" +
                            "nothing can be found!\n",
                            AppMsgBoxCaption,
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Exclamation);

                        searchState = SearchState.Canceled;
                        return;
                    }

                    DialogResult diagResult = MessageBox.Show(
                        this,
                        "'File name' is empty, everything is a match!\n" +
                        "Do you want to search anyway?",
                        AppMsgBoxCaption,
                        MessageBoxButtons.YesNo,
                        MessageBoxIcon.Question);

                    if (diagResult != DialogResult.Yes)
                    {
                        searchState = SearchState.Canceled;
                        return;
                    }
                }

                SetButtonBusyState();
                txtSearchStateVerbus.Text = "Searching...";
                txtSearchStateShort.Text  = "Searching...";
                dataGridViewResults.Rows.Clear();
                ColumnChecked.ReadOnly = true;
                SearchState            = SearchState.Searching;
                SearchStopwatch.Restart();
                UpdateSearchStatisticsTimer.Start();
            });

            if (searchState == SearchState.Canceled)
            {
                return(searchState);
            }

            searchState = SearchState.Searching;

            MatchedFiles = new List <Match>();               // Gathers all the matches. Currently its not used.
            List <Match>  newMatches  = new List <Match>();  // Holds the new matches of the currently searced foldr.
            List <string> folderStack = new List <string>(); // The folders to be searched. used as a stack -

            // after the folder at the top of the stack is searched,
            // it is removed and its subfolders are added to the top of the stack.
            // When the stack is empty, the search is done.
            // Add root folder.
            folderStack.Add(parentFolder);

            if (!matchCase)
            {
                searchPatterns = searchPatterns.Select(str => str.ToUpper()).ToArray();
            }

            while (folderStack.Count > 0)
            {
                folder = folderStack[folderStack.Count - 1];
                folderStack.RemoveAt(folderStack.Count - 1);

                this.Invoke(() =>
                {
                    txtSearchStateVerbus.Text = "Searching... \r\n" + folder;
                    // Display new matches from the previous folder.
                    DataGridViewResults_AddMatches(newMatches);
                });

                if (SearchTask_CancellationTs.IsCancellationRequested)
                {
                    searchState = SearchState.Stopped;
                    break;
                }

                try
                {
                    newMatches.Clear();

                    // Get new matches.
                    if (matchCase && matchWholeFileName)
                    {
                        if (searchFiles)
                        {
                            newMatches.AddRange(
                                Directory.EnumerateFiles(folder, "*", SearchOption.TopDirectoryOnly)
                                .Where(file => searchPatterns.Any(searchFile => Path.GetFileName(file) == searchFile))
                                .Select(file => new Match(file, MatchType.File)));
                        }

                        if (searchFolders)
                        {
                            newMatches.AddRange(
                                Directory.EnumerateDirectories(folder, "*", SearchOption.TopDirectoryOnly)
                                .Where(file => searchPatterns.Any(searchFile => Path.GetFileName(file) == searchFile))
                                .Select(file => new Match(file, MatchType.Folder)));
                        }
                    }
                    else if (!matchCase && matchWholeFileName)
                    {
                        if (searchFiles)
                        {
                            newMatches.AddRange(
                                Directory.EnumerateFiles(folder, "*", SearchOption.TopDirectoryOnly)
                                .Where(file => searchPatterns.Any(searchFile => Path.GetFileName(file).ToUpper() == searchFile))
                                .Select(file => new Match(file, MatchType.File)));
                        }

                        if (searchFolders)
                        {
                            newMatches.AddRange(
                                Directory.EnumerateDirectories(folder, "*", SearchOption.TopDirectoryOnly)
                                .Where(file => searchPatterns.Any(searchFile => Path.GetFileName(file).ToUpper() == searchFile))
                                .Select(file => new Match(file, MatchType.Folder)));
                        }
                    }
                    else if (matchCase && !matchWholeFileName)
                    {
                        if (searchFiles)
                        {
                            newMatches.AddRange(
                                Directory.EnumerateFiles(folder, "*", SearchOption.TopDirectoryOnly)
                                .Where(file => searchPatterns.Any(searchFile => Path.GetFileName(file).Contains(searchFile)))
                                .Select(file => new Match(file, MatchType.File)));
                        }

                        if (searchFolders)
                        {
                            newMatches.AddRange(
                                Directory.EnumerateDirectories(folder, "*", SearchOption.TopDirectoryOnly)
                                .Where(file => searchPatterns.Any(searchFile => Path.GetFileName(file).Contains(searchFile)))
                                .Select(file => new Match(file, MatchType.Folder)));
                        }
                    }
                    else if (!matchCase && !matchWholeFileName)
                    {
                        if (searchFiles)
                        {
                            newMatches.AddRange(
                                Directory.EnumerateFiles(folder, "*.*", SearchOption.TopDirectoryOnly)
                                .Where(file => searchPatterns.Any(searchFile => Path.GetFileName(file).ToUpper().Contains(searchFile)))
                                .Select(file => new Match(file, MatchType.File)));
                        }

                        if (searchFolders)
                        {
                            newMatches.AddRange(
                                Directory.EnumerateDirectories(folder, "*.*", SearchOption.TopDirectoryOnly)
                                .Where(file => searchPatterns.Any(searchFile => Path.GetFileName(file).ToUpper().Contains(searchFile)))
                                .Select(file => new Match(file, MatchType.Folder)));
                        }
                    }

                    MatchedFiles.AddRange(newMatches);
                }
                catch { }

                try
                {
                    // Add subfolders of the current folder.
                    // The folders are retrieved in an acceding order bot are used last first (FIFO) so the order is reversed.

                    int previouseCount = folderStack.Count;

                    folderStack.AddRange(Directory.EnumerateDirectories(
                                             folder, "*", SearchOption.TopDirectoryOnly).Reverse());
                }
                catch { }
            }

            this.Invoke(() =>
            {
                // Display new matches from the last folder.
                DataGridViewResults_AddMatches(newMatches);

                dataGridViewResults.Refresh();
            });

            if (searchState == SearchState.Searching)
            {
                searchState = SearchState.Completed;
            }
            return(searchState);
        }