Как найти файл и заменить в нем текст C#
Эта программа позволяет рекурсивно находить файлы в иерархии каталогов, которые соответствуют одному или нескольким шаблонам. Затем вы можете заменить текст в этих файлах новым текстом.
И поиск и поиск & amp; Заменить кнопки вызывают метод SearchForFiles. Единственное различие заключается в том, что кнопка Find передает этот метод a null для строки «replace with».
Следующий код показывает метод SearchForFiles.
// Поиск файлов, соответствующих шаблону, содержащему целевую строку // и при необходимости замените. private void SearchForFiles(ListBox lst, string start_dir, string pattern, string from_string, string to_string) { try { // Очистить результат ListBox. lstFiles.Items.Clear(); // Разбираем шаблоны. string[] patterns = ParsePatterns(pattern); // Если from_string пуст, не заменяйте. if (from_string.Length < 1) from_string = null; DirectoryInfo dir_info = new DirectoryInfo(start_dir); SearchDirectory(lst, dir_info, patterns, from_string, to_string); if (from_string == null) { MessageBox.Show("Found " + lst.Items.Count + " files."); } else { MessageBox.Show("Made replacements in " + lst.Items.Count + " files."); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
Метод SearchForFiles очищает результат программы ListBox. Затем он вызывает ParsePatterns, чтобы преобразовать шаблон поиска файла в массив шаблонов. Например, если шаблон представляет собой «Текстовые файлы (* .rtf, * .txt)», то ParsePatterns возвращает массив, содержащий значения * .rtf и * .txt. (Шаблон анализа использует методы string класса IndexOf, SubString и Split. Он не слишком сложный, поэтому он не является 't показан здесь. Загрузите пример и посмотрите на код, чтобы увидеть, как он работает.)
Далее SearchForFiles создает объект DirectoryInfo, представляющий каталог, имя которого вы ввели. Затем он вызывает следующий SearchDirectory метод, чтобы выполнить большую часть реальной работы.
// Поиск файлов, соответствующих шаблону, содержащему целевую строку // и при необходимости замените. private void SearchDirectory(ListBox lst, DirectoryInfo dir_info, string[] patterns, string from_string, string to_string) { // Поиск в этом каталоге. foreach (string pattern in patterns) { // Проверьте этот шаблон. foreach (FileInfo file_info in dir_info.GetFiles(pattern)) { // Обработать этот файл. ProcessFile(lst, file_info, from_string, to_string); } } // Поиск подкаталогов. foreach (DirectoryInfo subdir_info in dir_info.GetDirectories()) { SearchDirectory(lst, subdir_info, patterns, from_string, to_string); } }
Сначала метод обрабатывает файлы этого каталога. Для каждого шаблона файла код использует GetFiles для получения файлов, соответствующих шаблону. Для каждого файла код вызывает ProcessFile для обработки файла.
После обработки файлов код проходит через подкаталоги этого каталога, вызывающие SearchDirectory для каждого.
В следующем коде показан метод ProcessFile.
// Замените все вхождения from_string на to_string. // Возвращаем true, если возникла проблема, и мы должны остановиться. private void ProcessFile(ListBox lst, FileInfo file_info, string from_string, string to_string) { try { if (from_string == null) { // Добавьте файл в список. lst.Items.Add(file_info.FullName); } else { // Смотрите, содержит ли файл from_string. string txt = File.ReadAllText(file_info.FullName); if (txt.Contains(from_string)) { // Добавьте файл в список. lst.Items.Add(file_info.FullName); // Смотрите, нужно ли нам заменять. if (to_string != null) { File.WriteAllText(file_info.FullName, txt.Replace(from_string, to_string)); } } } } catch (Exception ex) { MessageBox.Show("Error processing file " + file_info.FullName + "\n" + ex.Message); } }
Если from_string является null, программа должна найти все файлы, не проверяя, содержат ли они целевую строку (потому что нет целевой строки). В этом случае программа просто добавляет имя файла к результату ListBox.
Если from_string не null, код считывает файл в строку и видит, содержит ли он from_string. Если файл содержит from_string, код добавляет имя файла в список. Если to_string также не null, код заменяет from_string на to_string в тексте и записывает текст обратно в файл.