Files search with regexp

Run Settings
LanguageC#
Language Version
Run Command
using System; using System.IO; using System.Text; using System.Text.RegularExpressions; namespace Files { // Класс для поиска текста в файлах, заданных маской 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; } } }
Editor Settings
Theme
Key bindings
Full width
Lines