Привет, ребята, снова,
Я только что написал следующий фрагмент кода, который работает для меня так, как я хотел.
Просто чтобы объяснить это немного:
Сначала я открываю файл конфигурации с помощью ConfigurationManager, получаю соответствующий раздел и устанавливаю для ForceSave значение true, чтобы этот раздел обязательно сохранялся.
Затем начинается «волшебство». Я перебираю все свойства настроек сборки и позволяю linq сделать свое волшебство, чтобы найти, существует ли элемент. Если нет, я создаю его и добавляю в файл.
Примечание : Этот фрагмент кода предназначен только для настроек приложения, но не для пользовательских настроек, поскольку это другой раздел. Я не пробовал / не проверял это, но это может быть так же просто, как изменить эту строку:
ConfigurationSectionGroup sectionGroup = configFile.SectionGroups["applicationSettings"];
к этой строке:
ConfigurationSectionGroup sectionGroup = configFile.SectionGroups["userSettings"];
так как это соответствующее название этого раздела. Хотя никаких гарантий.
Вот мой код:
/// <summary>
/// Loads own config file and compares its content to the settings, and adds missing entries with
/// their default value to the file and saves it.
/// </summary>
private void UpdateSettings()
{
// Load .config file
Configuration configFile = ConfigurationManager.OpenExeConfiguration(typeof(Settings).Assembly.Location);
// Get the wanted section
ConfigurationSectionGroup sectionGroup = configFile.SectionGroups["applicationSettings"];
ClientSettingsSection clientSettings = (ClientSettingsSection)sectionGroup.Sections[0];
// Make sure the section really is saved later on
clientSettings.SectionInformation.ForceSave = true;
// Iterate through all properties
foreach (SettingsProperty property in Settings.Default.Properties)
{
// if any element in Settings equals the property's name we know that it exists in the file
bool exists = clientSettings.Settings.Cast<SettingElement>().Any(element => element.Name == property.Name);
// Create the SettingElement with the default value if the element happens to be not there.
if (!exists)
{
var element = new SettingElement(property.Name, property.SerializeAs);
var xElement = new XElement(XName.Get("value"));
XmlDocument doc = new XmlDocument();
XmlElement valueXml = doc.ReadNode(xElement.CreateReader()) as XmlElement;
valueXml.InnerText = property.DefaultValue.ToString();
element.Value.ValueXml = valueXml;
clientSettings.Settings.Add(element);
}
}
// Save config
configFile.Save();
}