Безопасный способ найти строку в файлах в Win10 - PullRequest
0 голосов
/ 26 ноября 2018

Приложение, которое мы используем, сохраняет строку конфигурации в виде XML с тегом <connectionStrings>.Я пишу скрипт резервного копирования, который должен знать ту БД, на которую он указывает.Я нашел эту строку в разных файлах на разных машинах, в зависимости от того, как она была установлена.

Для начала я попытался просто использовать поиск Win10 в проводнике.Это не может найти строку независимо от того, какие варианты я пытаюсь.Я попытался пройтись вверх и вниз по дереву каталогов, даже выбрав папку, в которой находится текстовый файл, и он все еще не может найти ее.У меня включены все параметры поиска, есть идеи?

Но мой главный вопрос: есть ли сейчас каноническое решение для поиска строк в файлах в .Net?Я нахожу здесь много примеров, но они обычно используют внешние утилиты или просто читают каждый файл и ищут.В одном интересном решении использовался внешний индексатор, но это выходит за рамки этого проекта.

1 Ответ

0 голосов
/ 27 ноября 2018

Краткий ответ: Нет .Нет никакого предписанного способа сделать это в C #, потому что способ, которым вы это делаете, будет варьироваться в зависимости от вашего варианта использования.Тем не менее, существует множество вариантов для выполнения этого типа операции.

Для начала давайте рассмотрим, что если мы хотим найти содержимое в файле, в какой-то момент нам пришлось открыть файл и посмотреть его содержимое.Вы упомянули в своем последнем абзаце концепцию использования внешнего индексатора, который бы делал именно это.Как ни странно, это то же самое, что и поиск Windows, поэтому давайте начнем с этого.

Когда вы выполняете поиск Windows, он использует индекс поиска для поиска файлов.Если вы не находите искомые файлы, для этого есть несколько возможных причин.

  1. Индексирование поиска полностью отключено.
  2. Индексирование поиска не выполняется напапка, содержащая ваши файлы конфигурации.
  3. Индекс поиска не настроен для сканирования файлов с расширением вашей конфигурации.

Если все эти параметры настроены правильно, вы должны увидеть результаты при выполнениипоиск.Однако при выполнении поиска connectionStrings на моем компьютере я не получил ни одного из ожидаемых файлов web.config.Если копать немного глубже, Windows Search настроен только на Index Properties Only для .config файлов вместо Index Properties and File Contents.Вероятно, есть веская причина, по которой вам не следует индексировать эти файлы, но я оставлю это для другого поста.

В целом, я думаю, что попытка использовать Windows Search или другую библиотеку для этогоизлишним для такой основной задачи.Я предполагаю следующее.

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

Если вы знаете эти две вещи, эффективность поиска и поиска файлов должна быть хорошей.Вы хотите следовать шаблону, описанному ниже.

  1. Выберите корневую папку
  2. Список файлов в текущей папке.Выберите и файлы с расширениями, которые соответствуют вашему белому списку.
  3. Прочитайте содержимое файла и найдите свою строку.Вы можете сделать это, используя буферы, но вам нужно будет иметь немного более сложную логику для крайних случаев (когда ваш поисковый термин перекрывает край вашего буфера).В этом не должно быть необходимости, если только они не являются чем-то большим, чем просто конфигурационные файлы.
  4. Любые файлы, содержащие искомый термин, для которого вы выполняете требуемое действие.
  5. Теперь просканируйте текущую папку на наличиедругие папки.Рекурсивно обрабатывайте каждую папку, каждый раз возвращаясь к шагу № 2.

Чтобы усовершенствовать это решение, вы можете использовать временный кэш, где вы отслеживаете каждый соответствующий файл, для которого требуется создать резервную копию.,Вы можете сохранить этот кеш в файл (вместе с отметкой времени) и выполнять повторное сканирование только через определенный промежуток времени.Таким образом, для последующих запусков вашей утилиты резервного копирования вам не нужно искать файловую систему, вы просто создаете резервные копии файлов.

Другой вариант - сохранить черный список всех «ложноположительных» файлов, чтобы вы не делалине буду искать содержимое файлов в будущем.

Надеюсь, это поможет, и если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...