如何将应用程序设置保存到不同的位置和文件名

How to save Application Settings to a different location and file name

C# Windows 表格。

我已成功使用“应用程序设置”为表单上的控件值保存和加载用户设置。 我有一个复选框和代码,我可以在其中设置这是否自动发生(在应用程序启动和关闭时)。 我还有一个菜单,因此我可以在运行时加载和保存它们。 这都是使用默认的 user.config.

例子。 在我的应用程序设置中(对于其中一项,这是一个名为 RbBitRate6Mbps 的单选按钮):

名称:BitRate6Mbps

类型:字符串

范围:用户

值:假

要保存设置,我有一个菜单项,保存默认值。这运行:

if (RbBitRate6Mbps.Checked == true)
{
    Settings.Default["BitRate6Mbps"] = "True";
}

else
{
    Settings.Default["BitRate6Mbps"] = "False";
}

Settings.Default.Save();

要加载设置,我有一个菜单项,加载默认值。这运行:

if (Settings.Default["BitRate6Mbps"].ToString() == "True")
{
    RbBitRate6Mbps.Checked = true;
}

else
{
    RbBitRate6Mbps.Checked = false;
}

在上面的其余代码中,我保存和加载了大约 10 个其他控件(文本框、复选框和单选按钮)。 这一切都没有问题。

现在我想要几组这样的设置,每组都包含一些相同的值和一些不同的值。 每个都有不同的文件名,并保存到自定义位置(默认情况下为应用程序文件夹)。 我不介意文件是什么格式(xml、ini 等),但如果它与默认值相同,那就太好了。

我创建了新的菜单项,保存自定义设置加载自定义设置

我添加了一个 SaveFileDialog 和一个 LoadFileDialog,希望能用于上述操作。 但如果这些都不是必须的,那也很好。

这是我卡住的地方。

几天来我一直在寻找一个清楚的例子来说明如何做到这一点。 我找不到太多。我发现了什么,我一直无法理解文档。

我在想重新加载设置会更容易吗? 但我也认为,为了保存文件,使用:

Settings.Default.Save();

不会实现我的目标,因为它只会写入默认的 user.config 文件?

我想做的事情可行吗?

如果有,有人有任何说明和示例代码吗?

使用 OpenExeConfiguration 函数读取设置,然后在 Save 之前读取 Add/Update 键值。最后,您可以 ConfigurationManager.RefreshSection 刷新特定部分的设置。

示例位于 Link

static void AddUpdateAppSettings(string key, string value)  
{  
    try  
    {  
        var configFile = ConfigurationManager
                          .OpenExeConfiguration(ConfigurationUserLevel.None);  
        var settings = configFile.AppSettings.Settings;  
        if (settings[key] == null)  
        {  
            settings.Add(key, value);  
        }  
        else  
        {  
            settings[key].Value = value;  
        }  
        configFile.Save(ConfigurationSaveMode.Modified);  
        ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);  
    }  
    catch (ConfigurationErrorsException)  
    {  
        Console.WriteLine("Error writing app settings");  
    }  
} 

更新。我安装了一个新的 Settings Provider 并且运行良好。它将 XML 保存到应用程序文件夹。我还设置了 INI 文件来保存设置。同时使用自定义路径和自定义文件名。它允许创建多个 INI 文件。这也非常有效。

编辑:更新了代码(和说明),因此不再需要手动创建任何自定义文件夹。如果不存在,则创建。

XML 设置提供程序 开发人员项目位于此处:

Settings Providers on Github

INI 文件开发人员项目(和演示)位于此处:

C# WinForms Ini File demo on Github

以下是使用 XML 文件设置新 Settings Provider 的说明,随后是将设置保存到 INI 文件(两种类型可以同时在同一个项目中使用,就像我在这里做的那样):

使用新的设置提供程序将设置保存在 XML 文件中:

1。 设置 Application Settings(在 Solution Explorer 中,右键单击 App。然后 Select:Properties。然后打开:设置).

Name: txtFullName
Type: String
Scope: User
Value: John Doe

Name: txtSchool
Type: String
Scope: User
Value: Oxford

Name: txtClass
Type: String
Scope: User
Value: 4B

Name: chkActiveStudent
Type: bool
Scope: User
Value: True

2。 从 NuGet 安装新的 Settings Provider(在 Solution Explorer 中,右键单击:References。然后 Select: Manage NuGet Packages. 然后搜索: PortableSettingsProvider. Install it).

3。 在Program.cs中修改static void Main()。添加到它下面的行。

//PortableSettingsProvider.SettingsFileName = "portable.config";
//PortableSettingsProvider.SettingsDirectory = "c:\\testconfig\\school";
//System.IO.Directory.CreateDirectory(PortableSettingsProvider.SettingsDirectory);
PortableSettingsProvider.ApplyProvider(Properties.Settings.Default);

如果接受默认设置(配置文件 portable.config,将在应用程序文件夹中创建),正确编辑的 static void Main() 条目如下所示。

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);        
    //PortableSettingsProvider.SettingsFileName = "portable.config";
    //PortableSettingsProvider.SettingsDirectory = "c:\testconfig\school";
    //System.IO.Directory.CreateDirectory(PortableSettingsProvider.SettingsDirectory);
    PortableSettingsProvider.ApplyProvider(Properties.Settings.Default);            
    Application.Run(new MyTestApp());
}

3a。 要选择不同的文件名和位置,请删除注释 (//) 并更改为您对文件名和位置的偏好(文件夹名称之间需要双斜线)。在此示例中,我使用 settings.config 作为文件名,使用 c:\testconfig\school 作为路径)。在这种情况下,正确编辑的 static void Main() 条目将如下所示。

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);        
    PortableSettingsProvider.SettingsFileName = "settings.config";
    PortableSettingsProvider.SettingsDirectory = "c:\testconfig\school";
    System.IO.Directory.CreateDirectory(PortableSettingsProvider.SettingsDirectory);
    PortableSettingsProvider.ApplyProvider(Properties.Settings.Default);            
    Application.Run(new MyTestApp());
}

3b。 如果您希望在应用程序工作目录的子文件夹中创建设置目录,则更改代码以包含子文件夹名称(在此示例中,我使用 settings.config 作为文件名和 Settings 作为子文件夹)。在这种情况下,正确编辑的 static void Main() 条目将如下所示。

static void Main()
{
    Application.EnableVisualStyles();        
    PortableSettingsProvider.SettingsFileName = "settings.config";
    var strSettingsDirectory = Directory.GetCurrentDirectory() + "\Settings";
    System.IO.Directory.CreateDirectory(strSettingsDirectory);
    PortableSettingsProvider.SettingsDirectory = strSettingsDirectory;
    PortableSettingsProvider.ApplyProvider(Properties.Settings.Default);
    Application.Run(new MyTestApp());
}

4。 仍在 Program.cs 中,将以下行添加到现有 using 部分的底部。

using Bluegrams.Application;

5。 在表单上创建一些控件(这些将对应于步骤 1 中所做的 应用程序设置)。

TextBox. Name: txtFullName

TextBox. Name: txtSchool

Textbox. Name: txtClass

Checkbox. Name: chkActiveStudent

Button. Name: btnLoadSettings  Text: Load Config

Button. Name: btnSaveSettings  Text: Save Config

6. 输入 Load Config 按钮单击事件的代码 (btnLoadSettings)。

private void btnLoadSettings_Click(object sender, EventArgs e)
{
    txtName.Text = Properties.Settings.Default.txtName.ToString();
    txtSchool.Text = Properties.Settings.Default.txtSchool.ToString();
    txtClass.Text = Properties.Settings.Default.txtClass.ToString();

    if (Properties.Settings.Default.chkActiveStudent == true)
    {
        chkActiveStudent.Checked = true;
    }
    else
    {
        chkActiveStudent.Checked = false;
    }
}

7. 输入 Save Config 按钮单击事件的代码 (btnSaveSettings)。

private void btnSaveSettings_Click(object sender, EventArgs e)
{
    Properties.Settings.Default.txtName = txtName.Text;
    Properties.Settings.Default.txtSchool = txtSchool.Text;
    Properties.Settings.Default.txtClass = txtClass.Text;

    if (chkActiveStudent.Checked == true)
    {
        Properties.Settings.Default.chkActiveStudent = true;
    }

    else
    {
        Properties.Settings.Default.chkActiveStudent = false;
    }

    Properties.Settings.Default.Save();
}

8。 就是这样。

运行 应用程序。 使用第一个按钮加载设置)。 对控件上的文本进行一些更改。 使用第二个按钮保存它们。

如果您还没有创建自定义文件名 and/or 路径,那么在您的应用程序文件夹中应该有一个新文件:portable.config.

我的位于:C:\Users\flakie\source\repos\TestApp\TestApp\bin\Debug

您可以在 txt/xml 编辑器中打开文件以验证值是否已设置。

如果您再次 运行 应用并加载设置,您应该会看到新值。

将设置保存到多个 INI 文件的代码

以下说明更容易实现。 它们要求您设置应用程序设置,因为它们未被使用。 设置将保存在 1 个或多个 INI 文件中。

路径可以即时更改(尽管已设置默认值),INI 文件的文件名也可以。

它将再次使用应用程序自己的文件夹作为默认目标(对于 INI 文件)。

您只需要修改 Form.cs 文件。

演示(来自上面的 link)很容易理解,足以为我提供创建这个示例的知识(我是 C# 新手)。

9。 从 NuGet 安装 INI 文件包(在 Solution Explorer 中,右键单击:References。然后 Select:Manage NuGet Packages.然后搜索:PeanutButter.INI.Install it).

10。 在你的 Form.cs 文件中(Form1.cs 如果你没有更改名称),将以下行添加到底部现有 using 部分。

using PeanutButter.INIFile;

11。 在您的 Form.cs 文件中,直接在 public partial class Form1 : Form 行下方,添加以下单行代码。

private IINIFile _loadedConfig;

它应该如下所示。

public partial class Form1 : Form    {

    private IINIFile _loadedConfig;

12。 在表单上再创建两个按钮。

Button. Name: btnOpenIniFile  Text: Open INI

Button. Name: btnSaveIniFile  Text: Save INI

13。 输入 Open INI 按钮单击事件 (btnOpenIniFile) 的代码。

private void btnOpenIniFile_Click(object sender, EventArgs e) {        

    using(OpenFileDialog OpenFileIni = new OpenFileDialog()) {
        var strSettingsDirectory = Directory.GetCurrentDirectory() + "\Settings";
        System.IO.Directory.CreateDirectory(strSettingsDirectory);
        OpenFileIni.InitialDirectory = strSettingsDirectory;
        OpenFileIni.Filter = "INI File|*.ini";
        OpenFileIni.RestoreDirectory = true;
        OpenFileIni.CheckFileExists = true;
        OpenFileIni.CheckPathExists = true;
        OpenFileIni.Title = "Open an INI Settings File";

        if (OpenFileIni.ShowDialog() == DialogResult.OK)
        {
            _loadedConfig = new INIFile(OpenFileIni.FileName);    
            txtName.Text = _loadedConfig.HasSetting("UserSettings", "txtName") ? _loadedConfig["UserSettings"]["txtName"] : "";    
            txtSchool.Text = _loadedConfig.HasSetting("UserSettings", "txtSchool") ? _loadedConfig["UserSettings"]["txtSchool"] : "";    
            txtClass.Text = _loadedConfig.HasSetting("UserSettings", "txtClass") ? _loadedConfig["UserSettings"]["txtClass"] : "";

            if (_loadedConfig["UserSettings"]["chkActiveStudent"] == "Checked")
            {
                chkActiveStudent.Checked = true;
            }
            else
            {
                chkActiveStudent.Checked = false;
            }
        }
    }
}

14。 输入 Save INI 按钮单击事件的代码 (btnSaveIniFile)。

private void btnSaveIniFile_Click(object sender, EventArgs e)
{
    using (SaveFileDialog SaveFileIni = new SaveFileDialog())
    {
        var strSettingsDirectory = Directory.GetCurrentDirectory() + "\Settings";
        System.IO.Directory.CreateDirectory(strSettingsDirectory);
        SaveFileIni.InitialDirectory = strSettingsDirectory;
        SaveFileIni.Filter = "INI File|*.ini";
        SaveFileIni.Title = "Save an INI Settings File";

        if (SaveFileIni.ShowDialog() == DialogResult.OK)
        {
            _loadedConfig = new INIFile(SaveFileIni.FileName);
            _loadedConfig["UserSettings"]["txtName"] = txtName.Text;
            _loadedConfig["UserSettings"]["txtSchool"] = txtSchool.Text;
            _loadedConfig["UserSettings"]["txtClass"] = txtClass.Text;

            if (chkActiveStudent.Checked == true)
            {
                _loadedConfig["UserSettings"]["chkActiveStudent"] = "Checked";
            }
            else
            {
                _loadedConfig["UserSettings"]["chkActiveStudent"] = "UnChecked";
            }

            _loadedConfig.Persist();
        }
    }
}

15。 而已。 运行 应用程序。

对文本框控件上的文本进行一些更改。使用 Save INI 按钮保存它们。

系统将提示您输入文件名。它可以是你喜欢的任何东西(但在这个例子中,我使用了我在第一个文本框中设置的人的名字。 您不需要输入 ini 文件扩展名。您可以根据需要更改位置。

对文本框中的文本进行更多更改,但保存它们。 单击 打开 INI 按钮。浏览到您刚刚保存的 ini 文件并打开它。

您刚刚修改的文本,没有保存,现在应该更改为您保存到 ini 文件中的文本。