Главная страница Библиотека (скачать книги) Скачать софт Введение в программирование Стандарты для C++ Уроки по C# Уроки по Python HTML Веб-дизайн Ассемблер в среде Windows ActiveX Javascript Общее о Линукс Линукс - подробно Линукс - новое Delphi Паскаль для начинающих Турбопаскаль Новости Партнеры Наши предложения Архив новостей |
Практический пример. Поиск текста в файлах, заданных маской.Данная программа производит поиск указанного текста в файлах, соответствующих введенной маске. Маска задается в формате MSDOS: * - любой символ в любом количестве, ? - один любой символ. Для поиска файлов и текста в них используются регулярные выражения (которые должны были вам встречаться в предыдущих курсах). using System; using System.IO; using System.Text; using System.Text.RegularExpressions; namespace CSharpApplication.SearchInFiles { // Класс для поиска текста в файлах, заданных DOS'вской маской class Search { static void Main() { Console.Write("Введите путь к каталогу: "); string Path = Console.ReadLine(); Console.Write("Введите маску для файлов: "); string Mask = Console.ReadLine(); Console.Write("Введите текст для поиска в файлах: "); string Text = Console.ReadLine(); // Дописываем слэш (в случае его отсутствия) if(Path[Path.Length - 1] != '\\') Path += '\\'; // Создание объекта на основе введенного пути DirectoryInfo di = new DirectoryInfo(Path); // Если путь не существует if(!di.Exists) { Console.WriteLine("Некорректный путь!!!"); return; } // Преобразуем введенную маску для файлов // в регулярное выражение // Заменяем . на \. Mask = Mask.Replace(".", @"\." /* (".", "\\.") */); // Заменяем ? на . Mask = Mask.Replace("?", "."); // Заменяем * на .* Mask = Mask.Replace("*", ".*"); // Указываем, что требуется найти точное соответствие маске Mask = "^" + Mask + "$"; // Создание объекта регулярного выражения // на основе маски Regex regMask = new Regex(Mask, RegexOptions.IgnoreCase); // Экранируем спецсимволы во введенном тексте Text = Regex.Escape(Text); // Создание объекта регулярного выражения // на основе текста Regex regText = new Regex(Text, RegexOptions.IgnoreCase); // Вызываем функцию поиска ulong Count = FindTextInFiles(di, regText, regMask); Console.WriteLine("Всего обработано файлов: {0}.", Count); } // Функция поиска static ulong FindTextInFiles(DirectoryInfo di, Regex regText, Regex regMask) { // Поток для чтения из файла StreamReader sr = null; // Список найденных совпадений MatchCollection mc = null; // Количество обработанных файлов ulong CountOfMatchFiles = 0; FileInfo [] fi = null; try { // Получаем список файлов fi = di.GetFiles(); } catch { return CountOfMatchFiles; } // Перебираем список файлов foreach(FileInfo f in fi) { // Если файл соответствует маске if(regMask.IsMatch(f.Name)) { // Увеличиваем счетчик ++CountOfMatchFiles; Console.WriteLine("File " + f.Name + ":"); // Открываем файл sr = new StreamReader(di.FullName + @"\" + f.Name, Encoding.Default); // Считываем целиком string Content = sr.ReadToEnd(); // Закрываем файл sr.Close(); // Ищем заданный текст mc = regText.Matches(Content); // Перебираем список вхождений foreach(Match m in mc) { Console.WriteLine("Текст найден в позиции {0}.", m.Index); } /******************************************************/ /* Отладочная информация /******************************************************/ if(mc.Count == 0) { Console.WriteLine("В данном файле запрошенный текст не найден."); } } } /******************************************************/ /* Отладочная информация /******************************************************/ Console.WriteLine("Количество обработанных файлов в каталоге {0} {1}", di.FullName, CountOfMatchFiles); // Получаем список подкаталогов DirectoryInfo [] diSub = di.GetDirectories(); // Для каждого из них вызываем (рекурсивно) // эту же функцию поиска foreach(DirectoryInfo diSubDir in diSub) CountOfMatchFiles += FindTextInFiles(diSubDir, regText, regMask); // Возврат количества обработанных файлов return CountOfMatchFiles; } } } Домашнее задание
|
|
Библиотека программиста. 2009. |
|