• Добро пожаловать на сайт - Forumteam.digital !

    Что бы просматривать темы форума необходимо зарегестрироваться или войти в свой аккаунт.

    Группа в телеграме (подпишитесь, что бы не потерять нас) - ForumTeam Chat [Подписатся]
    Связь с администратором - @ftmadmin

33. Работа с поиском и задание на дом.

Redman

<FORUMTEAM>
Команда форума
Регистрация
13.11.17
Сообщения
13.340
Реакции
8.377
Баллы
1.200
FTC
208¢
Практический пример. Поиск текста в файлах, заданных маской.
Данная программа производит поиск указанного текста в файлах, соответствующих введенной маске. Маска задается в формате 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;
        }
    }
}

Домашнее задание
  1. Создать программу, которая ищет в указанном каталоге файлы, удовлетворяющие заданной маске, и дата последней модификации которых находится в указанном диапазоне. Поиск производится как в указанном каталоге, так и в его подкаталогах. Результаты поиска сбрасываются в файл отчета.
  2. Создать программу для поиска указанного текста в файлах, удовлетворяющих заданной маске, и замене этого тектса на другой указанный текст. Поиск производится как в указанном каталоге, так и в его подкаталогах.
  3. Создать программу для поиска по всему диску файлов и каталогов, удовлетворяющих заданной маске. Необходимо вывести найденную информацию на экран в компактном виде (с нумерацией объектов) и запросить у пользователя о дальнейших действиях. Варианты действий: удалить все найденное, удалить указанный файл (каталог), удалить диапазон файлов (каталогов).
 
Сверху Снизу