Как то раз я подумал: «А ведь иногда при вводе имени файла по запросу программы, он может точно не знать путь к нему, однако быть уверенным в том, что файл с таким названием существует. Возможно, иногда может быть полезным добавить в программу функцию поиска файла, чтобы она могла сама найти его, например, во вложенных файлах или через тот же интерфейс уточнить, есть такой или нет» Естественно, полез за ответом в поисковик. Естественно, интересовала реализация на C#, т.к. работаю я сейчас на этом языке и надо бы его потихоньку изучать и узнавать получше его возможности. По соответствующему запросу (который выглядел точно так же, как и заголовок статьи – «поиск файлов на C#«) нашел несколько форумов, на одном из которых был дан ответ.
Я решил сделать небольшую программку для поиска заданного файла в заданном и каталоге и подпапках. Здесь мне хочется привести пример её кода и поделиться некоторыми проблемами, которые возникли при отладке.
Ниже представлены эти самые «особенности» программы:
- при попытке искать в защищенном каталоге программа выдаст ошибку и остановит поиск;
- выяснилось, что конструкция ‘/’ воспринимается не как один символ, а как несколько; причем означают они по утверждению Visual Studio «конец строки».
Это те проблемы, которые решить мне пока не удалось. И если вторую я смог обойти (изменив несколько задуманный функционал программы), то первая все-еще портит впечатление и удовольствие от использования своей программы.
Итак, вот пример кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
using System; using System.Windows.Forms; using System.IO;//для DirectoryInfo using System.Diagnostics;//для Process namespace FileSearch { public partial class SearchForm : Form { public SearchForm() { InitializeComponent(); } /// /// обработка нажатия по кнопке "искать!" /// private void _bFind_Click(object sender, EventArgs e) { try { _bClear_Click(sender, e);//очищаем поле с предыдущими результатами DirectoryInfo dir = new DirectoryInfo(this._tbView.Text); string file = this._tbFile.Text; FindInDir(dir, file, this._cbRecurs.Checked);//если нажат чекбокс, то поиск будет идти только в заданной папке } catch (Exception ex) { MessageBox.Show(ex.Message); } } /// /// поиск файла в папке /// ///Параметры: ///в какой папке искать /// ///какой файл искать /// ///искать ли в подпапках public void FindInDir(DirectoryInfo dir, string pattern, bool recursive) { foreach (FileInfo file in dir.GetFiles(pattern)) { this._lbAnser.Items.Add(file.FullName); } if (recursive) { foreach (DirectoryInfo subdir in dir.GetDirectories()) { this.FindInDir(subdir, pattern, recursive); } } } /// /// поиск файла в директории /// ///Параметры: ///где искать /// ///имя файла для поиска public void FindFiles(string dir, string pattern) { this.FindInDir(new DirectoryInfo(dir), pattern, true); } /// /// обработка нажатия по кнопке "обзор" /// private void _bView_Click(object sender, EventArgs e) { if (this._fBrowserDialog.ShowDialog() == DialogResult.OK) { this._tbView.Text = this._fBrowserDialog.SelectedPath; } } /// /// обработка нажатия по кнопке "очистить" /// private void _bClear_Click(object sender, EventArgs e) { this._lbAnser.Items.Clear(); } /// /// обработка нажатия по кнопке "очистить все" /// private void _bClearAll_Click(object sender, EventArgs e) { this._tbFile.Text = ""; this._tbView.Text = ""; this._lbAnser.Items.Clear(); } /// /// обработка двойного клика мыши по результатам /// private void lbAnswer_MouseDoubleClick(object sender, MouseEventArgs e) { Process.Start(this._lbAnser.SelectedItem.ToString());//пытаемся открыть файл программой по умолчанию } } } |
Надеюсь, что благодаря комментариям в коде большинство возможных вопросов разрешится.
Однако, все-таки отмечу некоторые моменты подробнее:
- Поиск поддиректорий в директории активируется, только если функции FindInDir в качестве 3-его параметра придет «true»;
- На форму был кинут элемент FolderBrowserDialog. Именно он появляется при нажатии кнопки «Обзор…»;
- Запуск файла осуществляется через проводник командой Process.Start(«Путь к файлу или папке»).
Итак, что делает данная программа:
- Нужное имя файла и корневая папка для поиска задаются в соответствующих полях.
- Имя папки можно как ввести вручную, так и выбрать с помощью диалога после нажатия кнопки «Обзор…».
- Если галочка установлена, то поиск будет происходить также в подпапках. Если нет – то не будет. (По умолчанию галочка стоит).
- После нажатия кнопки «Искать!» происходит поиск заданного файла в заданной директории.
Если на этом этапе возникает какая либо ошибка (например, не указано имя корневой папки), то выдается сообщение об этом и дальнейший поиск останавливается. - Если в процессе поиска обнаруживаются соответствующие запросу файлы, то они выводятся списком в элемент управления ListBox, расположенный под кнопкой «Искать!»
- По двойному клику левой кнопки мыши на элементе из списка, происходит его открытие стандартной программой для данного типа файлов.
- Есть возможность очищать поле результатов. Для этого необходимо нажать кнопку «Очистить».
- Чтобы очистить как поле результатов, так и поля с данными для поиска, необходимо нажать кнопку «Очистить все».
- При осуществлении нового поиска результаты предыдущего автоматически стираются.
Вот исходник моей программы для поиска файлов на компьютере.
Полезная статья? Их будет больше, если вы поддержите меня!