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) 앱 설정에 대한 사용자 설정이 다시 저장 될 것으로 예상하는 곳은 어디입니까? 디버그 폴더 또는 C : \ Documents and Settings \ USERNAME \ Local Settings \ Application Data 폴더에 있습니까?




3
실행 파일이있는 폴더에 있습니다. 따라서 Visual Studio에서 Debug 아래에 실행하면 프로젝트의 Debug 폴더에 있습니다.
Justin

1
저스틴이 말한 것과 동일합니다. Visual Studio에서 실행하는 경우 애플리케이션을 다시 실행할 때마다 프로젝트의 Debug 폴더에있는 .config 파일을 덮어 씁니다.
Welton v3.60

답변:


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
아마도. 나는 그것이 나를 잘 해냈 기 때문에 항상 별도의 파일을 사용했습니다. 그렇다면 방금 배운 것이 있습니다
Dan

흥미롭게도 이것과 ConfigurationManager를 사용하면 모든 설정이 App.config 파일에 있지만 다른 섹션에 있습니다. 나는 2 개의 다른 파일을 기대하고 있었다.
RyanfaeScotland

나는 내가 지금까지 XML 파일을 반복하고 있다는 것을 믿을 수 없다. 이 유용한 팁에 감사드립니다!
Smitty-Werben-Jager-Manjenson

78

나는 내가 늦었다는 것을 안다. :) 그러나 이것은 내가 그것을하는 방법 :

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
위와 관련하여 주목해야 할 한 가지 주요 사항은 디버거 (Visual Studio 내)에서이를 실행하는 경우 빌드 할 때마다 app.config 파일을 덮어 쓴다는 것입니다. 이를 테스트하는 가장 좋은 방법은 애플리케이션을 빌드 한 다음 출력 디렉토리로 이동하여 거기에서 실행 파일을 시작하는 것입니다. ---에서 vbcity.com/forums/t/152772.aspx
유 양 지앤

69

app.config 파일의 appSettings 섹션에서 값을 변경하는 방법 :

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

일을합니다.

물론 더 나은 연습은 설정 클래스이지만 당신이 무엇을 추구하는지에 달려 있습니다.


4
국내외 세 kajillion의 appSettings는 수정 아이디어를보고 한 후,이 간단한 / 최고이며, (결정적) 사용자가 <appSettings는> 노드를 파괴하는 경우에도 작동
downwitch

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 양식에 관한 것이므로 여기에 해결책이 있습니다.

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을 빠르게 연속적으로 쓴 다음 읽는 경우 특히 중요합니다.
Trevor 2011

6

ConfigurationManager는 시작 프로젝트에있는 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로 돌아갑니다.

따라서 잘못된 파일을 확인하거나 잘못된 시간을 확인하면 아무것도 변경되지 않은 것을 볼 수 있습니다.


0

수동으로 변경할 수 있습니다.

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.