2009-12-08 3 views
6

.net 설정 파일에 대한 많은 게시물이 있지만, 필자는 요구 사항이 제안 된 솔루션을 허용하지 않는다고 생각합니다. 그렇지 않으면 프로세스가 저에게 맞는지 알 수 없습니다..NET 구성 파일 (app.config, settings.settings)을 사용하여 모든 응용 프로그램 데이터를 저장하고 복원하는 방법?

상황에 따라 특정 사용자 입력 필드 (예 : IP 주소)뿐만 아니라 양식 속성 (창 크기 등)을 응용 프로그램 설정에 바인딩하는 Windows Forms 응용 프로그램 (다른 응용 프로그램 일 수도 있음)이 있습니다 속성 -> 설정 영역). 알 수 있듯이이 설정은 내 프로젝트의 app.config 파일에 표시된 설정과 동일하므로 System.Configuration.ConfigurationManager 클래스를 사용하여 해당 설정을 조작 할 수 있어야합니다.

내가하고 싶은 일은 사용자가 저장된 설정을 모두 내보내고 가져올 수있게하려는 것입니다. 일부 사용자 지정 개체의 직렬화 또는 INI 파일 작업보다는 응용 프로그램에서 사용하는 구성 파일을 저장하고 바꾸는 것이 더 쉽다고 생각했습니다.

그것은 지정된 파일에 현재 설정을 저장하기 위해 상대적으로 쉽다 : 현재 설정을 덮어 쓰기 설정 파일을 복원

그러나
internal static void Export(string settingsFilePath) 
{ 
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 
    config.SaveAs(settingsFilePath); 
} 

이 어려운 증명한다. 내가 그렇게

var newConfig = ConfigurationManager.OpenExeConfiguration(settingsFilePath) 

같은 구성 파일을 열 수 있지만 완전히 가져온 파일의 사람들과 현재 설정에서 모든 설정을 교체하는 방법을 볼 수없는 것 보인다. [편집 :이 오버로드는 .config 파일이 아닌 .exe 경로를 수신해야합니다. 이 방법으로 exe 파일을 열면 호출 코드가 구성 파일의 동일한 어셈블리를 참조하지 않을 경우 ConfigurationErrorsException이 발생합니다.]

아마도 other posts에 설명 된 방법을 사용하면 설정이 아니라 모든 것이 있지만,이 시점에서 어떻게 작동하는지 보지 못합니다.

아이디어가 있으십니까? 올바른 길을 가고 있습니까, 아니면 그냥 INI 파일 (또는 다른 것)을 사용해야합니까?

답변

1

전체 구성 파일을 무시하는 것이 좋습니다. 이 파일의 일부 설정에는 코드가 실제로 .NET CLR 시작과 관련된 작업을 수행하기 전에 실제로 처리 할 설정이 포함될 수 있습니다.

+0

전체 파일을 조작하지 않는 것이 옳은 것 같습니다. 적어도 메모리에 관심이 있다고 생각되는 "appSettings"섹션보다 많은 섹션이 있습니다. 내 말은, 시도해보십시오 var currentConfig = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.PerUserRoamingAndLocal); currentConfig.Dump(); in LINQPad. – Pat

+0

변경하고자하는 "appSettings"값이 아니라 "userSettings"값이라는 것을 발견했습니다. 특히 자식 노드 인 입니다. – Pat

3

당신이 파일은 당신이하여 XDocument에로드 할 수있는 간단한 XML 파일의 app.config 이후 :


string path = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; 
XDocument doc = XDocument.Load(path); 
//Do your modifications to section x 
doc.Save(path); 
ConfigurationManager.RefreshSection("x"); 
내가 패트의 의견

+0

권장 사항을 보내 주셔서 감사합니다.하지만 지정한 경로가 사용자 설정을 변경하기위한 올바른 경로가 아닙니다. 또한, 다른 사람이 이것을 시도하려는 경우,로드는 XDocument 클래스의 정적 메서드이므로 구문은 var doc = XDocument.Load (path);입니다. XML 파일의 섹션을 읽고 바꾸는 작업을 계속 수행하여이 방법이 작동하는지 확인하지만 아직 행운은 없습니다. – Pat

+0

경로는 App.config를 가리켜 야합니다. 어디에서 조작하고 싶은 부분이 어디인지 생각했습니다. – Manu

3
를 @를 따라 XDocument.Load() 코드를 수정

app.config에 쓰지 말고 수정 된 사용자 설정을 저장하는 설정 파일을 사용하는 것이 가장 좋습니다. app.config 및 web.config는 읽기 전용 값에 대해서만 사용해야합니다.

+0

그래, 어떻게 된거야? 이미 설정 파일을 사용하여 응용 프로그램 실행 사이에 사용자 입력을 유지하지만 어떻게 정보를 별도의 파일 (가져 오기/내보내기)로 저장하고 복원 할 수 있습니까? – Pat

+0

Manu의 아래 게시물에서 XML 파일로 생각하면됩니다. – Kenoyer130

+0

다시 말하지만, 어떻게 완료 되었습니까? 내 이해는 "파일"설정은 실제로 app.config이며, 설정이 저장되는 위치입니다. 설명? – Pat

0

파일을 XML로 읽으려는 Manu의 제안 덕분에 나는 this solution을 해킹했습니다. TextBox의 Text 속성과 같이 문자열로 저장된 속성의 현재 양식에서만 작동하며 NumericUpDown 컨트롤의 Value 속성을 유지하는 경우와 같이 작동하지 않습니다.

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <userSettings> 
     <HawkConfigGUI.Properties.Settings> 
      <setting name="FpgaFilePath" serializeAs="String"> 
       <value>testfpga</value> 
      </setting> 
      <setting name="FirmwareFilePath" serializeAs="String"> 
       <value>test</value> 
      </setting> 
     </HawkConfigGUI.Properties.Settings> 
    </userSettings> 
</configuration> 

그런 다음 파일을 가져 오기 및 모든 설정은 응용 프로그램에서 변경 (잊지 마세요 :)는 다음과 같은 것이 같은 파일을 생성하는 저장 파일의 경로로 내보내기를 사용하여 작동 어떤 시점에서.() 저장하십시오. 문제가 발생하면 설정이 되돌아갑니다. 내가 어떤 다른 답변을받지 내 이전 솔루션에 만족하지 않았다 않았기 때문에

using System; 
using System.Configuration; 
using System.IO; 
using System.Linq; 
using System.Xml.Linq; 
using System.Xml.XPath; 
using AedUtils; 

namespace HawkConfigGUI 
{ 
    public static class SettingsIO 
    { 
     private static NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger(); 

     internal static void Import(string settingsFilePath) 
     { 
      if (!File.Exists(settingsFilePath)) 
      { 
       throw new FileNotFoundException(); 
      } 

      var appSettings = Properties.Settings.Default; 
      try 
      { 
       // Open settings file as XML 
       var import = XDocument.Load(settingsFilePath); 
       // Get the <setting> elements 
       var settings = import.XPathSelectElements("//setting"); 
       foreach (var setting in settings) 
       { 
        string name = setting.Attribute("name").Value; 
        string value = setting.XPathSelectElement("value").FirstNode.ToString(); 

        try 
        { 
         appSettings[name] = value; // throws SettingsPropertyNotFoundException 
        } 
        catch (SettingsPropertyNotFoundException spnfe) 
        { 
         _logger.WarnException("An imported setting ({0}) did not match an existing setting.".FormatString(name), spnfe); 
        } 
        catch (SettingsPropertyWrongTypeException typeException) 
        { 
         _logger.WarnException(string.Empty, typeException); 
        } 
       } 
      } 
      catch (Exception exc) 
      { 
       _logger.ErrorException("Could not import settings.", exc); 
       appSettings.Reload(); // from last set saved, not defaults 
      } 
     } 

     internal static void Export(string settingsFilePath) 
     { 
      var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 
      config.SaveAs(settingsFilePath); 
     } 
    } 
} 
+1

누군가가 이것을 "나쁜"대답이라고 생각하는 이유와 누군가가 "좋은"답을내는 이유를 알고 싶습니다. 이 코드가 작동하고 다른 작업 솔루션이 제시되지 않았다는 것만 알면됩니다. – Pat

+0

그런데이 솔루션은 app.config 파일을 조작하지 않습니다. 응용 프로그램 닫기시 파일로 전송되는 user.config의 메모리 내 버전을 수정합니다. – Pat