将WinForms(C#)APP设置迁移到.config文件

时间:2009-12-09 14:40:06

标签: c# winforms configurationmanager

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

我需要做的是首先创建文件,然后写入文件,最后它已经存在,更新它!看起来很简单,但到目前为止,它在每一个转折点都是我。到目前为止我提到的所有材料都存在。甚至MS MCTS参考书都有一个配置文件已经为例子做了。

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

这些例子让这看起来很简单,但当你看到有问题的文件上的时间戳时...... 划伤了他的头......帽子掉了!

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

感谢您的回复。 Ibrar

5 个答案:

答案 0 :(得分:5)

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

NameSpace.your.applicationName.exe.config

这是您应该寻找的文件,以及您正在编写的任何自定义代码中的读/写。

正如其他答案所提到的那样,小心这样做。这不是微不足道的。此文件只是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>

答案 1 :(得分:1)

以下是如何创建自定义配置文件,存储一些配置数据,然后将其与一些if exists语句一起读回以创建它的示例(如果需要)。希望将它翻译成C#并不会那么麻烦。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If System.IO.File.Exists(System.IO.Directory.GetCurrentDirectory() + "\Settings.Config") Then
        FileOpen(1, System.IO.Directory.GetCurrentDirectory() + "\Settings.Config", OpenMode.Random, OpenAccess.ReadWrite)
        FileGet(1, SettingVar1, 1)
        FileGet(1, SettingVar2, 2)
        FileGet(1, SettingVar3, 3)
        'etc
        FileClose(1)
    Else
        FileOpen(1, System.IO.Directory.GetCurrentDirectory() + "\Settings.Config", Openmode.Random, OpenAccess.ReadWrite)
        FilePut(1, "Static Setting to write", 1) 'insert a string
        FilePut(1, 3, 2) 'insert a number
        FilePut(1, New DBMC, 3) 'Any object
        'etc...
        FileClose(1)
    End If
End Sub

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

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

答案 2 :(得分:1)

搞定了。

1)首先将配置文件添加到项目中。

2)将其命名或重命名为application-like-for-like。

3)确保以.config

结尾

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

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

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

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

- &GT;暂时坚持枚举对象上的“无”...稍后为不同的用户等进行实验。

7)调试项目并运行几次,以确保配置对象正确地获取配置文件,并且其文件路径属性正确指向配置文件的位置。所以在运行时,它将在\ bin \ debug \ ....下 -----&GT;检查has ffile属性,并确保它也是真的。

8)在此阶段,配置对象已正确设置并准备就绪。现在添加您的条目​​,就像使用键值对概念将条目添加到Hashtable或Dictionary中一样。

config.AppSettings.Settings.Add("Key", "Value");

9)一旦你添加了一些样本测试数据,最后要做的就是保存配置。

config.Save();

10)最后,导航到build output文件夹并检查文件配置文件是否已更改。

更新:你可能会发现最终在输出目录中的vshost.exe文件可能会搞砸了,因为我注意到我的配置对象指向了这些xml文件而不是我的配置文件。在VS IDE之外,这是O.K,因为vhsost文件没有被部署而没有被使用,但是在IDE中它很好地让它在那里工作。如果发生这种情况,请按照我的帖子进行操作。

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

答案 3 :(得分:0)

我自己对配置文件感到头疼。最后,我选择简单地创建我自己的设置类,并根据需要(de)将其作为XML序列化为光盘。

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

  • 更灵活
  • 您必须编写更多代码
  • 类型安全(请参阅按类型而非字符串ID设置)

当然,其他一些考虑因素,但第三个是我最喜欢的。

答案 4 :(得分:0)

尽管这不是答案,而是上一篇文章的后续跟进。

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()'方法。虽然我确实设法让它工作...我发现在测试并擦除我的区域在每个构建下我发现相反我的应用程序自动寻找'MyFileExplorer.config'它而不是寻找vshost.exe.config文件某种。我不知道为什么要找这个文件?由于filePath属性是一个访问者属性,所以我无法更改它的值。

我会进一步尝试看看我是否可以让它重新开始工作!