当程序第一次运行时,如何写出空白版本的配置



我一直在c#中制作一个命令行工具,我们最终使用了一些参数的配置,这些参数只需要设置一次。我没有为这些提供UI,而是被告知只设置一个空白配置,如果没有设置值,则提供一条消息,说明配置在哪里,并进行设置。

结果证明这非常困难!

我需要做的事情如下:

  • 获取配置的路径
  • 为相关属性保存一个带有存根的空白配置

该工具是使用CC.net发布的,并使用wix创建了一个msi。不幸的是,这是相关的!

获取配置的路径

这一点很简单:

你只需要使用这样的东西:

public string FileLocation
{
get { return Configuration.FilePath; }
}
private static Configuration Configuration
{
get { return OpenConfig(ConfigurationUserLevel.PerUserRoamingAndLocal); }
}
private static Configuration OpenConfig(ConfigurationUserLevel userLevel)
{
return ConfigurationManager.OpenExeConfiguration(userLevel);
}

传入的枚举还有另外两个值:None似乎指向app.config所在的位置,PerUserRoaming似乎总是指向不存在的位置。我找不到更多关于何时适合使用的细节,但在我的情况下,它似乎不是。

正如上面所提到的,这个调用的一个令人困惑的地方是,如果文件被保存/存在,它将返回文件的路径。这意味着这个文件通常不存在!ConfigurationManager和Settings(从ApplicationSettingsBase派生的自动生成类)之间不明确的关系给我带来了很多痛苦!

保存空白配置

一些绊脚石如下:

如果添加设置。设置类这还将添加一个app.config。除非您将其与已安装的程序一起提供,否则您将看到程序的已安装版本和开发版本之间的不同行为-一个将使用app.config中的值创建设置文件,另一个不会。对我来说,最简单的解决方案是完全删除app.config。

我试图在配置上使用保存方法,该方法允许您指定保存所有属性(无论值为默认值),并允许您指定即使配置未修改也要保存。然而,在设置了两个标志的情况下调用此方法不会有任何作用-在设置之前,您在设计器中创建的设置似乎在某种程度上是不真实的-Configuration和ConfigurationManager是较老的操作方式,虽然ApplicationSettingsBase可能使用了其中一个或两个,但它们不能很好地集成。

更令人困惑的是,如果查询设置,则它们将具有值(对于字符串,它们将具有")。但是,如果保存设置,则这些设置不会保存到文件中指定的位置!事实上,根本不会创建任何文件!尽管如果您有一个app.config,但如果您使用上面的强制保存方法,将创建一个文件,因为默认值是在app.config中指定的!

解决方案似乎是检查每个属性中的默认值,然后设置默认值。这看起来应该是一个no-op,但getter并没有遵循"如果我没有设置,我会在查询时创建它"的逻辑,相反,它只是假装存在一个具有默认值的设置。设置任何值似乎实际上都会创建设置。

var somethingUnSet = _settings.Something == "";
if (somethingUnset)
_settings.Something = "";
if(somethingUnset|| somethingElseUnset)
{
_settings.Save();
ExitWithError("config needs setting up at " + _settings.FileLocation);
return;
}  

最后,这给了我想要的结果-一个文件被保存在配置管理器指定的位置,其中包含需要填写的空属性。想想UI会更快!!!

我使用了一个包装的Settings对象来方便在测试中更改值,而不必处理singleton。这也有一个很好的副作用,即您可以添加额外的代码(如文件位置),并且在添加更多设置时不必担心代码生成会覆盖内容。

只需通过第一次启动将.config文件中的所有项设置为零,如:

ConfigurationManager.appSettings["item1"] = ""; 

并检查值。

但是你为什么不检查参数是否设置好,如果没有,抛出一个错误,我认为你不需要清除配置文件来检查它是否第一次启动

最新更新