Как читать и писать любую старую строку в любой старый файл конфигурации? - PullRequest
0 голосов
/ 18 февраля 2019

c #, .net

Это проблема, на которую я смотрел около 15 лет назад, когда впервые вышел .net 2.0.На первый взгляд это звучит очень легко, но мне было невероятно трудно взломать, в основном потому, что информации было очень мало.Я взломал его в конце, но пришло время снова взглянуть на проблему, и я могу либо попытаться повторно использовать свой 15-летний код, либо я могу выяснить, есть ли лучший способ сделать это.Я выбрал последнее, если это возможно, но мне все еще не удается найти что-нибудь подходящее.

Мой exe - C: \ Program Files ...................... \ wwww.exe.

Я хочу посмотреть в d: \ где-то еще \ xxxx.config, то есть в произвольном месте.

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

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

Итак, забудьте о корректных разделах AppSettings в wwww.exe.config - то, что я ищу, гораздо сложнее.

Я только что посмотрел на код, который написал для этого - это много строк - он начинается с OpenMappedExeConfiguration и просто выводит информацию по одному шагу за раз.Окончательное значение возвращается как object.ToString ().Должен быть лучший способ.Мне было интересно, есть ли у кого-нибудь подход, который они используют, который они считают лаконичным и элегантным?

1 Ответ

0 голосов
/ 20 февраля 2019

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

Файл конфигурации Microsoft - это специально структурированный файл XML, у Microsoft есть отдельная сборка для работы.с одной, System.Configuration, и я действительно ожидал, что любой участник знал бы это, конечно, если бы они чувствовали, что знают достаточно, чтобы внести свой вклад вообще.Так что предложения, основанные на System.Xml и более ранних версиях System.IO, насколько мне было известно, просто получили букву "F".Я воспринял их как в основном шутливые, и мне остается удивляться, почему кто-то участвует в сайте обмена информацией, если не быть полезным.Но в любом случае мое решение опирается на System.Configuration.

Для краткости в псевдокоде:

  • Я могу использовать ConfigurationManager.OpenMappedExeConfiguration, чтобы открыть любой старый файл.Это, я думаю, хорошо известно, и возвращает объект конфигурации, который представляет собой логическое представление файла.Забавно, что даже если файл не существует на диске, Конфигурация не равна нулю.
  • Предполагая, что мои настройки лежат в разделе appSettings файла, я могу просто использовать полученное свойство AppSettings Конфигурацииотточить в соответствующем разделе.Кажется, я помню, что мой старый код поддерживал любой раздел, что сильно увеличивало код.Опять же, даже если файл не существует физически, Configuration.AppSettings был допустимым объектом.
  • Когда у меня есть свойство раздела настроек приложения, я могу посмотреть на свойство .Settings, чтобы увидеть, какие значения есть.appSettingsSection.Settings - это в основном словарь пар key.value, обозначаемый как (Microsoft) KeyValueConfigurationCollection.Если файл не существует, appSettings.Settings указывает на совершенно допустимую, но пустую коллекцию
  • . Я могу увидеть, существует ли мой ключ, просто выполнив стандартный словарь. Содержит вызов моего ElementCollection.AllKeys.свойство
  • Имейте в виду, что здесь мы имеем дело с парами ключ / значение.Если мы работаем с существующим ключом, мы просто получаем / устанавливаем элемент [key] .Value, тогда как если мы пишем новый ключ, мы должны создать новый (Microsoft) KeyValueConfigurationElement и добавить его в коллекцию.Этот класс имеет удобный конструктор, который просто принимает ключ (string) и значение (string).Еще одна вещь, которую сделал мой исходный код, состояла в том, чтобы читать / записывать любой сериализуемый объект, гораздо больше, чем мне нужно в этот раз.
  • Если я пишу, мне нужно помнить в последнюю очередь, чтобы сохранить конфигурацию,Если вы пишете, файл либо обновлен, либо создан чистый.

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

Кстати, я не мог поделиться оригинальным кодом, потому что у меня нет ни самого кода, ни авторских прав.В моей юрисдикции работодатель / клиент обычно владеет кодом, написанным сотрудником / консультантом, по крайней мере, работая в свое время, и я не был исключением.Но у меня есть только опыт Великобритании и США, поэтому другие юрисдикции могут отличаться.И люди, которые профессионально не участвуют в разработке программного обеспечения, могут подчиняться другим правилам.И наконец, за многие годы я обнаружил, что многие разработчики программного обеспечения вообще не знают юридических вопросов.

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