【问题标题】:How to read and write any old string to any old config file?如何读取任何旧字符串并将其写入任何旧配置文件?
【发布时间】:2019-02-18 17:32:56
【问题描述】:

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() 返回。一定有更好的方法。我想知道是否有人有任何他们认为简洁优雅的方法?

【问题讨论】:

  • 我不明白。您只想从文本文件中读取和写入一些数据?使用 System.IO.File 的方法来执行此操作有什么问题?
  • 如果您显示当前运行不正常的代码并指出有问题的部分,将会很有帮助。
  • 投票关闭为重复,因为听起来你在问如何读取和写入 xml 文件。如果我在这里误解了某些内容,请添加更多详细信息。
  • @RufusL 它是一个 xml 文件,但它符合 Microsoft .NET 配置文件的格式。所以不同之处在于我正在寻找基于 ConfigurationManager 的答案,而不是基于 System.Xml 的答案。抱歉,我应该在问题中这么说。
  • 我还添加了一个配置管理器副本。这有帮助吗?

标签: c# .net configuration-files


【解决方案1】:

我部分解决了这个问题,但不得不假设我的设置位于文件的某个部分 (appSettings)。我可以侥幸逃脱,因为虽然这些设置在逻辑上是用户设置,但每个用户已经拥有自己的配置文件。

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

为了简洁,伪代码:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多