如何读取任何旧字符串并将其写入任何旧配置文件?

How to read and write any old string to any old config file?

c#、.net

这是我在大约 15 年前 .net 2.0 刚出来时看到的一个问题。表面上看起来很容易,但我发现破解起来非常困难,主要是因为信息太少了。我最终破解了它,但现在是时候重新审视这个问题了,我可以尝试重用我的 15yo 代码,或者我可以调查是否有更好的方法来做到这一点。如果可能的话,我选择了后者,但我仍然找不到相关的东西。

我的exe文件是C:\Program Files......................\wwww.exe.

我想在 d:\somewhere else\xxxx.config 中查看,即随机位置。

在该文件中,我想转到自定义部分 yyyyy,即随机部分。

并且我希望能够读取和写入字符串值 zzzzz。这个值最终是一个字符串是我可以做出的唯一有效假设。

所以,忘掉 wwww.exe.config 中表现良好的 AppSettings 部分吧——我要找的东西要复杂得多。

我刚刚查看了我为此编写的代码 - 它有很多行 - 它从 OpenMappedExeConfiguration 开始,一次只逐步解决问题。最终值作为 object.ToString() 返回。必须有更好的方法。我想知道是否有人使用过他们认为简洁优雅的方法?

我部分解决了这个问题,但必须假设我的设置位于文件的特定部分 (appSettings)。我可以摆脱这个,因为虽然设置在逻辑上是用户设置,但每个用户都有自己的配置文件。

Microsoft 配置文件是一个特殊结构的 XML 文件,Microsoft 有一个专门的程序集来处理它,System.Configuration,我真的希望任何贡献者都知道这一点,当然,如果他们觉得自己知道的足以做出贡献的话。因此,就我而言,基于 System.Xml 和更糟糕的 System.IO 的建议只是得到了 "F"。我认为它们大多是滑稽的,我想知道为什么有人参与信息共享站点,如果不是为了提供帮助的话。但无论如何,我的解决方案依赖于 System.Configuration.

为简洁起见,在伪代码中:

  • 我可以使用 ConfigurationManager.OpenMappedExeConfiguration 打开任何旧文件。我想这是众所周知的,并且 returns 一个 Configuration 对象,它是文件的逻辑视图。很有趣,即使磁盘上不存在该文件,Configuration 也是非空的。
  • 假设我的设置位于文件的 appSettings 部分,我可以只使用生成的配置的 AppSettings 属性 来研究相关部分。我似乎记得我的旧代码支持任何部分,这大大增加了代码量。同样,即使文件在物理上不存在,Configuration.AppSettings 也是一个有效对象。
  • 当我有应用程序设置部分 属性 时,我可以查看 .Settings 属性 以查看那里有哪些值。 appSettingsSection.Settings 基本上是 key.value 对的字典,装扮成 (Microsoft) KeyValueConfigurationCollection。如果文件不存在,appSettings.Settings 指向一个完全有效但为空的集合,
  • 我可以通过标准字典查看我的密钥是否已经存在。包含对我的 ElementCollection.AllKeys 属性
  • 的调用
  • 请记住,我们在这里处理 key/value 对。如果我们使用现有的密钥,我们只需 get/set element[key].Value,而如果我们正在编写一个新密钥,我们必须创建一个新的 (Microsoft) KeyValueConfigurationElement 并将其添加到集合中.这个 class 有一个方便的构造函数,它只接受 (string) 键和 (string) 值。我的原始代码所做的另一件事是 read/write 任何可序列化对象,这远远超出了我这次的需要。
  • 如果我正在写作,我需要记住最后保存配置。如果您正在写作,文件要么已更新,要么已创建一个干净的文件。

就是这样。我猜当前的任何读者都已经知道这一切,但我希望它对未来的读者有用。我发现整理这个很有用,把各个部分放在一起需要一段时间,所以它至少可以节省人们的时间。

顺便说一句,我无法分享原始代码的原因是因为我既不拥有代码本身,也不拥有版权。在我的管辖范围内,employer/client 拥有 employee/consultant 编写的代码是很常见的,至少在他们工作的时候是这样,我也不例外。但我只有英国和美国的经验,所以其他司法管辖区可能会有所不同。而且,不专业参与软件开发的人可能会完全遵守不同的规则。最后,多年来我发现许多软件开发人员完全不了解法律问题。