private void searchButton_Click(object sender, EventArgs e) { // Clear the results list resultsList.Items.Clear(); // Get the parameters for the search thread String fileNamesString = fileNameTextBox.Text; String[] fileNames = fileNamesString.Split(new Char[] { ';' }); List <String> validFileNames = new List <String>(); foreach (String fileName in fileNames) { String trimmedFileName = fileName.Trim(); if (trimmedFileName != "") { validFileNames.Add(trimmedFileName); } } Encoding encoding = Encoding.ASCII; SearcherParams pars = new SearcherParams(searchDirTextBox.Text.Trim(), validFileNames, containingTextBox.Text.Trim(), encoding); // Start the search thread if it is not already running if (Searcher.StartSearch(pars)) { } else { MessageBox.Show("The searcher is already running.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
public void StartSearch() { bool AllOk = true; //попытка доступа к директории - если успешно то все остается неизменным try { parentDirectory.GetDirectories(); } //Если возникло исключение - переменная AllOk получает значение false catch { AllOk = false; } //Если доступ был успешным то получаем подкаталоги if (AllOk) { if (parentDirectory.GetDirectories().Length != 0) { //Для каждого подкаталога запускаем новый поиск foreach (DirectoryInfo di in parentDirectory.GetDirectories()) { Searcher second = new Searcher(di, fileName, crTimeBeg, crTimeEnd, sizeInKbBegin, sizeInKbEnd); second.StartSearch(); //Получаем список файлов удовлетворяющих условия для подкаталога this.FindedFiles.AddRange(second.FindedFiles); } //Находим файлы удовлетворяющие условия в самом каталоге this.SearchFile(parentDirectory); } else { //Если подкаталогов нет просто ищем файлы в текущем this.FindedFiles.AddRange(this.SearchFile(this.parentDirectory)); } } }
//Метод класса Form2 который реализует многопоточность private void DoItParalell(DirectoryInfo di) { //если в директории есть вложенные папки выполнится следующий код if (di.GetDirectories().Length != 0) { //создадим новый список екземпляров поискового класса Searchers = new List <Searcher>(); //создадим новый список потоков Threads = new List <Thread>(); //для каждой папки в корневой выполним создание поискового класса и потока foreach (DirectoryInfo subdir in di.GetDirectories()) { Searcher s1 = new Searcher(subdir, this.FileName, this.BegDate, this.EndDate, this.MinSize, this.MaxSize); this.Searchers.Add(s1); Thread t1 = new Thread(new ThreadStart(s1.StartSearch)); this.Threads.Add(t1); } //запускаем потоки на выполнение foreach (Thread item in this.Threads) { item.Start(); } //ждем завершения работы всех потоков while (true) { int endCount = 0; foreach (Thread item in this.Threads) { //проверка состояния потока if (item.ThreadState == ThreadState.Running) { endCount++; } } //если вторичных потоков больше нет основной поток продолжает работу if (endCount == 0) { break; } } int counter = 0; //Для каждого поискового класса читаем список найденных файлов foreach (Searcher si in Searchers) { //Добавляем информацию про каждый полученный файл в список на форме foreach (FileInfo fi in si.FindedFiles) { this.listView1.Items.Add(fi.Name); this.listView1.Items[counter].SubItems.Add(fi.DirectoryName); this.listView1.Items[counter].SubItems.Add((fi.Length / 1000).ToString()); this.listView1.Items[counter].SubItems.Add(fi.CreationTime.ToString()); counter++; } } //Создаем екземпляр поискового класса для поиска в корен дисков/входных директорий Searcher ls = new Searcher(di, this.FileName, this.BegDate, this.EndDate, this.MinSize, this.MaxSize); //Ищем файлы только внутри корневой директории List <FileInfo> localsFile = ls.SearchFile(di); //Добавляем найденные файлы в визуальный список на форме foreach (FileInfo fi in localsFile) { this.listView1.Items.Add(fi.Name); this.listView1.Items[counter].SubItems.Add(fi.DirectoryName); this.listView1.Items[counter].SubItems.Add((fi.Length / 10).ToString()); this.listView1.Items[counter].SubItems.Add(fi.CreationTime.ToString()); counter++; } //Выводим сообщение о количестве отысканных файлов this.lbProgress.Text = "Done!" + " Finded " + listView1.Items.Count + " files."; //Если файлов в поисковых классах не обнаружено в метку на форме //выводится сообщение "File not found" if (counter == 0) { this.lbProgress.Text = "File not found"; } } else { //Создается единый екземпляр класс Searcher Searcher singleSearch = new Searcher(di, this.FileName, this.BegDate, this.EndDate, this.MinSize, this.MaxSize); //Проводится поиск в одном потоке singleSearch.StartSearch(); int counter = 0; //Получаем все отысканные файлы и выводим в список на форме foreach (FileInfo fi in singleSearch.FindedFiles) { this.listView1.Items.Add(fi.Name); this.listView1.Items[counter].SubItems.Add(fi.DirectoryName); this.listView1.Items[counter].SubItems.Add((fi.Length / 100).ToString()); this.listView1.Items[counter].SubItems.Add(fi.CreationTime.ToString()); counter++; this.lbProgress.Text = "Done!"; } //Если файлы не найдены - выводим сообщение if (counter == 0) { this.lbProgress.Text = "File not found"; } } }