Как то раз я подумал: «А ведь иногда при вводе имени файла по запросу программы, он может точно не знать путь к нему, однако быть уверенным в том, что файл с таким названием существует. Возможно, иногда может быть полезным добавить в программу функцию поиска файла, чтобы она могла сама найти его, например, во вложенных файлах или через тот же интерфейс уточнить, есть такой или нет» Естественно, полез за ответом в поисковик. Естественно, интересовала реализация на C#, т.к. работаю я сейчас на этом языке и надо бы его потихоньку изучать и узнавать получше его возможности. По соответствующему запросу (который выглядел точно так же, как и заголовок статьи – «поиск файлов на C#«) нашел несколько форумов, на одном из которых был дан ответ.
Я решил сделать небольшую программку для поиска заданного файла в заданном и каталоге и подпапках. Здесь мне хочется привести пример её кода и поделиться некоторыми проблемами, которые возникли при отладке.
Ниже представлены эти самые «особенности» программы:
- при попытке искать в защищенном каталоге программа выдаст ошибку и остановит поиск;
- выяснилось, что конструкция ‘/’ воспринимается не как один символ, а как несколько; причем означают они по утверждению Visual Studio «конец строки».
Это те проблемы, которые решить мне пока не удалось. И если вторую я смог обойти (изменив несколько задуманный функционал программы), то первая все-еще портит впечатление и удовольствие от использования своей программы.
Итак, вот пример кода:
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, расположенный под кнопкой «Искать!»
- По двойному клику левой кнопки мыши на элементе из списка, происходит его открытие стандартной программой для данного типа файлов.
- Есть возможность очищать поле результатов. Для этого необходимо нажать кнопку «Очистить».
- Чтобы очистить как поле результатов, так и поля с данными для поиска, необходимо нажать кнопку «Очистить все».
- При осуществлении нового поиска результаты предыдущего автоматически стираются.
Вот исходник моей программы для поиска файлов на компьютере.
Полезная статья? Их будет больше, если вы поддержите меня!
Архив комментариев
9 комментариев из прежней версии блога. Архив закрыт для новых ответов.
Спасибо огромное!!!!! Сама при вводе в поисковик «работа с файлами С#» нашла только пару форумов… Если бы не ты, то так бы и мучилась. Программа полностью работоспособна! Спасибо, спасибо, спасибо!
Подскажите как скомпилировать код.
Виндовс апликейшн выбираю , вставляю код с помощью копи паста , нажимаю CTRL+F5 вываливает гору ошибок.
Объясните как скомпилировать плиз! Очень надо.
Просьба отозваться как можно быстрее. Сори в С новичок.
Виктор, а зачем использовать копи-паст, если выложен архив с рабочим примером?
Ну а если такое дикое желание усложнять себе жизнь — тогда надо не забыть создать кнопки на форме и привязать к ним нужные события. Как? Смотри упомянутый выше архив с кодом.
Rossky, спасибо сразу не заметил)
У вас есть аська или скайп? рад был бы пообщаться =)
Можно попробовать стукнуть в аську шесть1678ноль2пять4
Здравствуйте. А не подскажете как модернизировать программу, чтобы она искала одинаковые файлы в нескольких подкаталогах выбранного каталога; в логическом диске; в нескольких локальных дисках ПК.
Можно использовать готовые dll, win32 api
Одинаковые файлы — файлы с одинаковыми именами и размерами.
Екатерина, здравствуйте. К сожалению, я не могу подсказать ничего конкретного по вашему вопросу. Единственное, если вы действительно собираетесь определять «одинаковость» файлов только по их именам и размерам, то мне кажется, что здесь должно быть не сложным получить информацию о размере конкретного файла. Главное, не забыть, что даже файлы с одинаковым именем и размером все еще могут быть разными, и проверить это дополнительно.