Quick actions

cmd+k|ctrl+k

Navigation

Languages

Files search with regexp

Snippet info

Language

Csharp

Visibility

public

Author

speranskiyva

Created

2018-10-26T20:30:53Z

Updated

2018-10-27T15:23:14Z

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;
        }
    }
}
INFO