ConfigurationManager.AppSettings-変更して保存する方法は?


81

質問するのは些細なことのように聞こえるかもしれません。私は記事で提案されているのと同じことをしますが、期待どおりに機能しません。誰かが私を正しい方向に向けることができることを願っています。

AppSettingsごとにユーザー設定を保存したいと思います。

Winformが閉じたら、これをトリガーします。

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

if (ConfigurationManager.AppSettings["IntegrateWithPerforce"] != null)
    ConfigurationManager.AppSettings["IntegrateWithPerforce"] = 
                                           e.Payload.IntegrateCheckBox.ToString();
else
    config.AppSettings.Settings.Add("IntegrateWithPerforce", 
                                          e.Payload.IntegrateCheckBox.ToString());

config.Save(ConfigurationSaveMode.Modified);

したがって、エントリがまだ存在しない場合は、単に作成するだけです。それ以外の場合は、既存のエントリを変更します。ただし、これは保存されません。

1)私は何が間違っていますか?

2)アプリ設定のユーザー設定が再び保存されることを期待していますか?DebugフォルダーまたはC:\ Documents and Settings \ USERNAME \ Local Settings \ Application Dataフォルダーにありますか?


これを参照してください:stackoverflow.com/questions/453161/…–
Kumar


3
実行可能ファイルが配置されているフォルダーにあります。したがって、Visual Studioから[デバッグ]で実行している場合は、プロジェクトの[デバッグ]フォルダーにあります。
ジャスティン

1
ジャスティンが言ったことと同じ。また、Visual Studioから実行している場合は、アプリケーションを再実行するたびに、プロジェクトのDebugフォルダーにある.configファイルが上書きされます。
ウェルトンv3.60 2013年

1
geekswithblogs.net/akraus1/archive/2006/01/04/64871.aspxこの助けを願っています:)
Thomas

回答:


25

おそらく、設定ファイルの追加を検討する必要があります。(例:App.Settings)このファイルを作成すると、次のことが可能になります。

string mysetting = App.Default.MySetting;
App.Default.MySetting = "my new setting";

これは、アイテムが強く入力されているアイテムを編集してから変更できることを意味します。何よりも、デプロイする前にxmlに触れる必要はありません。

結果は、アプリケーションまたはユーザーのコンテキスト設定です。

設定ファイルの「新規項目追加」メニューをご覧ください。


1
Settings.Settingsファイルを追加するか、Properties / Settings.settingsの下にある既存のファイルを使用することは、同じことですよね?既存のものを使用する場合は、次のようにします。Properties.Settings.Default.IntegrateWithPerforce= _integrateCheckBox.Checked; Properties.Settings.Default.Save();
houman 2011年

1
おそらく。私はいつも別々のファイルを使用してきました。もしそうなら、私はちょうど何かを学びました
ダン

これとConfigurationManagerを使用すると、すべての設定がApp.configファイルに含まれますが、セクションが異なります。私は2つの異なるファイルを期待していました。
RyanfaeScotland 2018

ずっとXMLファイルをループしているなんて信じられません。この便利なヒントをどうもありがとう!
スミッティ-Werben-イェーガー-Manjenson

80

私は遅れていることを知っています:)しかしこれは私がそれをする方法です:

public static void AddOrUpdateAppSettings(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");
    }
}

詳細については、MSDNを参照してください


3
上記で注意すべき重要な点の1つは、これをデバッガー(Visual Studio内)から実行している場合、ビルドするたびにapp.configファイルが上書きされることです。これをテストする最良の方法は、アプリケーションをビルドしてから、出力ディレクトリに移動し、そこから実行可能ファイルを起動することです。--- vbcity.com/forums/t/152772.aspx
yu yang Jian

69

app.configファイルのappSettingsセクションの値を変更する方法について:

config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);

仕事をします。

もちろん、より良い練習は設定クラスですが、それはあなたが何を求めているかによります。


4
国内外で3つの数千万のAppSettings変更のアイデアを検討した後、これは最も単純で最良であり、ユーザーが<appSettings>ノードを破壊した場合でも(重要なことに)機能します
ダウンウィッチ2014

39

優先<appSettings><customUserSetting>セクション。(Web)ConfigurationManagerを使用すると、読み取りと書き込みがはるかに簡単になります。ConfigurationSection、ConfigurationElement、およびConfigurationElementCollectionでは、カスタムクラスを派生させ、カスタムConfigurationPropertyプロパティを実装する必要があります。単なる日常の人間のIMOにはあまりにも多すぎます。

web.configの読み取りと書き込みの例を次に示します。

using System.Web.Configuration;
using System.Configuration;

Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
string oldValue = config.AppSettings.Settings["SomeKey"].Value;
config.AppSettings.Settings["SomeKey"].Value = "NewValue";
config.Save(ConfigurationSaveMode.Modified);

前:

<appSettings>
  <add key="SomeKey" value="oldValue" />
</appSettings>

後:

<appSettings>
  <add key="SomeKey" value="newValue" />
</appSettings>

23

基本的な質問はwinフォームに関するものなので、ここで解決策があります:( user1032413によってコードをrflectwindowsForms設定に変更しただけです)それが新しいキーの場合:

Configuration config = configurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings.Add("Key","Value");
config.Save(ConfigurationSaveMode.Modified);

キーがすでに存在する場合:

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["Key"].Value="Value";
config.Save(ConfigurationSaveMode.Modified);

8

保存呼び出しの後にこれを追加してみてください。

ConfigurationManager.RefreshSection( "appSettings" );

1
これは、同じappSettingをすばやく連続して書き込んでから読み取る場合に、特に重要です。
トレバー

6

ConfigurationManagerは1つのapp.config(スタートアッププロジェクトにあるもの)のみを使用することに注意してください。

あるapp.configをソリューションAに配置し、別のソリューションBからそれを参照する場合、Bを実行すると、Aからのapp.configは無視されます。

したがって、たとえば、単体テストプロジェクトには独自のapp.configが必要です。


2

問題は、デバッグビジュアルスタジオで通常のexeNameを使用しないことだと思います。

indtead "NameApplication" .host.exeを使用します

したがって、構成ファイルの名前は「NameApplication」.exe.configではなく「NameApplication」.host.exe.configです。

そして、アプリケーションが閉じた後-それは戻るapp.configに戻ります

したがって、間違ったファイルをチェックしたり、間違った時間をチェックしたりすると、何も変更されていないことがわかります。


-1

手動で変更できます。

private void UpdateConfigFile(string appConfigPath, string key, string value)
{
     var appConfigContent = File.ReadAllText(appConfigPath);
     var searchedString = $"<add key=\"{key}\" value=\"";
     var index = appConfigContent.IndexOf(searchedString) + searchedString.Length;
     var currentValue = appConfigContent.Substring(index, appConfigContent.IndexOf("\"", index) - index);
     var newContent = appConfigContent.Replace($"{searchedString}{currentValue}\"", $"{searchedString}{newValue}\"");
     File.WriteAllText(appConfigPath, newContent);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.