将WinForms(C#)应用程序设置迁移到.config文件

将WinForms(C#)应用程序设置迁移到.config文件,c#,winforms,configurationmanager,C#,Winforms,Configurationmanager,我想将当前使用的设置文件迁移到appconfig文件。 目前,我正试图复制它,但到目前为止,我甚至无法使用配置管理器将其写入文件 我需要做的是首先创建该文件,然后写入该文件,最后更新它!。看起来很简单,但到目前为止,我一直在逃避。到目前为止,我提到的所有材料都假设它存在。即使是MS MCTS参考书也已经为这些示例创建了一个配置文件 假设您有足够的权限,是否有一种编程方式来创建它,然后写入应用程序的默认bin文件夹 这些例子让这个看起来很简单,但是当你看到这个文件上的时间戳时,你会抓挠他的头。。。

我想将当前使用的设置文件迁移到appconfig文件。 目前,我正试图复制它,但到目前为止,我甚至无法使用配置管理器将其写入文件

我需要做的是首先创建该文件,然后写入该文件,最后更新它!。看起来很简单,但到目前为止,我一直在逃避。到目前为止,我提到的所有材料都假设它存在。即使是MS MCTS参考书也已经为这些示例创建了一个配置文件

假设您有足够的权限,是否有一种编程方式来创建它,然后写入应用程序的默认bin文件夹

这些例子让这个看起来很简单,但是当你看到这个文件上的时间戳时,你会抓挠他的头。。。帽子掉下来了

我的意思是它们是不同类型的配置文件吗?我知道web.config和app.config,但人们真的偏离了这个简单的命名模板多少

谢谢你的回复。
Ibrar

我自己也对配置文件摸不着头脑。最后,我选择了简单地创建自己的设置类,并根据需要将其作为XML反序列化到光盘

序列化自己的设置文件的注意事项:

  • 更灵活
  • 你必须写更多的代码
  • 类型安全(请参阅按类型而不是按字符串ID设置)

当然还有很多其他的考虑,但第三个是我最喜欢的。

首先,你说
app.config
是一个配置文件。事实并非如此。VS在编译期间使用Visual Studio中的源文件创建配置文件。在编译过程中,如果Visual Studio检测到app.config,它会将其复制到CompileTuion的输出文件夹,并将其重命名为(假定程序集的完全限定名为
NameSpace.your.applicationName

这就是您应该查找的文件,并在您正在编写的任何自定义代码中读取/写入该文件

正如其他答案提到的,要小心这样做。这不是小事。此文件只是CLR用于管理应用程序配置的完整系统的一部分,您可以很容易地将其弄乱

最后,请调查名为
configSource
的配置文件元素。使用此选项,您可以在app.config中放置一个元素,该元素“重定向”配置系统以在单独的文件中查找特定的配置部分。您可以通过如下方式修改app.config中的section元素来使用它:

<MyConfigSectionName configSource="ConfigFolder\MySpecConfigFile.xml" />

或者,要将现有的.Net配置节移动到单独的文件中

<appSettings configSource="ConfigFolder\MyAppSettings.xml" />

然后,您可以创建一个包含所需设置的单独配置文件,并打开、读取和写入该文件

文件MyAppSettings.xml的内容:

<?xml version="1.0" encoding="utf-8" ?>

<appSettings>
  <add key="limitToSingleInstance" value="true"/>
  <add key="maximumCacheFiles" value="1000"/>
  <add key="maximumThreadCount" value="5"/>
</appSettings>

下面是一个示例,介绍如何创建自定义配置文件,存储一些配置数据,然后将其与一些if-exists语句一起读回,以便在需要时创建它。希望把它翻译成C不会有那么多麻烦

可能需要注意的是,.NET有一个内置的设置文件,VB可以引用它(My.Settings),它可以做与此相同的事情,但不需要通过代码管理该文件。还有用于保存设置变量的注册表(如果您感到勇敢并承诺在卸载程序时清理注册表),以及许多其他正确的方法

另外,请注意,许多开发人员不赞成使用随机访问文件,而且由于与大型随机访问文件相关的某些开销,这些文件通常不再被大量使用。但是,为了简单起见,随机访问文件是一种非常容易理解的创建和控制配置文件的方法。

使其正常工作

1) 首先向项目中添加一个配置文件

2) 命名或重命名为application-like的名称

3) 确保它以.config结尾


4) 设置配置文件的属性,以便将其复制到输出文件夹

5) 确保项目正确引用了“项目引用”下的配置程序集

6) 像这样创建配置对象,例如:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
-->现在继续使用枚举对象上的“无”。。。稍后针对不同的用户进行实验等

7) 调试项目并运行几次,以确保配置对象正确地拾取配置文件,并且其文件路径属性正确地指向配置文件的位置。所以在运行时,这将在\bin\debug\。。。。 ----->同时检查has ffile属性并确保其为true

8) 在此阶段,配置对象已正确设置并准备就绪。现在添加条目,就像使用键值对概念将条目添加到哈希表或字典中一样

config.AppSettings.Settings.Add("Key", "Value");
9) 一旦添加了一些示例测试数据,最后要做的就是保存配置

config.Save();
10) 最后,导航到buildoutput文件夹并检查文件配置文件是否已更改

更新:您可能会发现输出目录中的vshost.exe文件可能会把事情搞砸,因为我注意到我的配置对象指向了这些xml文件中的一个,而不是我的配置文件。在VS IDE之外,这是可以的,因为vhsost文件没有部署和使用,但是在IDE中,很好地让它在那里工作。因此,如果发生这种情况,请跟随我下面的帖子


这就是我或多或少在寻找的答案。。。感谢所有回复。

尽管这不是答案,而是上一篇文章的后续内容

private void saveAllMenuItem_Click(object sender, EventArgs e)
    {
        // Set up the config object .... with a default user level.
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

        if (isWindowsDriveSet())
        {
            // Save the drive name and write it to a config file.
            config.AppSettings.Settings.Add("Drive", WindowsDrive());
        }
        else
        {
            MessageBox.Show("Please set your windows drive before proceeding!", "Windows Drive Not Set!",
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }

        if (ShowHiddenFilesSetting()) // only true (executes) if the app is showing 'ALL' files.
        {
            config.AppSettings.Settings.Add("FileSettings", FileSettings());
        }
        else // else default is implied.
        {
            config.AppSettings.Settings.Add("FileSettings", FileSettings());            
        }

        // Notify the user that the method has completed successfully.
        toolStripStatusLabel.Text = "Settings saved.";

        // Log to the logger what has just happened here.
        ActionOccured(this, new ActionOccuredEventArgs("0", DateTime.Now.ToString(), "The user has saved his settings."));

        // Finally save to the config.
        config.Save();
    }
上面是我保存应用程序设置的“Save()”方法。虽然我设法让它工作。。。我发现,在每次构建时测试并清除我的区域后,我发现我的应用程序
config.Save();
private void saveAllMenuItem_Click(object sender, EventArgs e)
    {
        // Set up the config object .... with a default user level.
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

        if (isWindowsDriveSet())
        {
            // Save the drive name and write it to a config file.
            config.AppSettings.Settings.Add("Drive", WindowsDrive());
        }
        else
        {
            MessageBox.Show("Please set your windows drive before proceeding!", "Windows Drive Not Set!",
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }

        if (ShowHiddenFilesSetting()) // only true (executes) if the app is showing 'ALL' files.
        {
            config.AppSettings.Settings.Add("FileSettings", FileSettings());
        }
        else // else default is implied.
        {
            config.AppSettings.Settings.Add("FileSettings", FileSettings());            
        }

        // Notify the user that the method has completed successfully.
        toolStripStatusLabel.Text = "Settings saved.";

        // Log to the logger what has just happened here.
        ActionOccured(this, new ActionOccuredEventArgs("0", DateTime.Now.ToString(), "The user has saved his settings."));

        // Finally save to the config.
        config.Save();
    }