- Автор темы
- #1
Практический пример. Поиск текста в файлах, заданных маской.
Данная программа производит поиск указанного текста в файлах, соответствующих введенной маске. Маска задается в формате MSDOS: * - любой символ в любом количестве, ? - один любой символ. Для поиска файлов и текста в них используются регулярные выражения (которые должны были вам встречаться в предыдущих курсах).
Домашнее задание
Данная программа производит поиск указанного текста в файлах, соответствующих введенной маске. Маска задается в формате 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;
}
}
}
Домашнее задание
- Создать программу, которая ищет в указанном каталоге файлы, удовлетворяющие заданной маске, и дата последней модификации которых находится в указанном диапазоне. Поиск производится как в указанном каталоге, так и в его подкаталогах. Результаты поиска сбрасываются в файл отчета.
- Создать программу для поиска указанного текста в файлах, удовлетворяющих заданной маске, и замене этого тектса на другой указанный текст. Поиск производится как в указанном каталоге, так и в его подкаталогах.
- Создать программу для поиска по всему диску файлов и каталогов, удовлетворяющих заданной маске. Необходимо вывести найденную информацию на экран в компактном виде (с нумерацией объектов) и запросить у пользователя о дальнейших действиях. Варианты действий: удалить все найденное, удалить указанный файл (каталог), удалить диапазон файлов (каталогов).