별도의 DB를 사용하지 않는 간단한 WinForm이나 WPF 프로젝트의 경우 설정값을 XML형식의 config 파일을 활용하면 간편하다.
ini 파일 사용의 경우 추가적으로 32비트 커널 모듈을 끌어다 써야하기 때문에 성능저하의 문제도 있고, MS에서도 Deprecate 하는 부분이라 닷넷에서 기본 제공하는 ConfigurationManager를 사용하는 편이 훨씬 낫다.
프로젝트에서 Properties의 Resource를 활용하면 app.config에 기본으로 제공하는 설정외에 사용자의 추가설정이 들어가게 되고 user.config 형태로 사용자설정값이 별도로 AppData 폴더의 Romaing 폴더 아래에 다소 복잡한 경로로 생성되어 저장된다.
ConfigurationUserLevel이 None이면 프로그램이 실행되는 위치에 '프로젝트명.exe.config' 파일로 저장되는데 이걸 맘대로 바꾸고 싶을 경우 저장 위치와 파일명을 일일히 지정해야 하는 번거로움이 있지만 이게 필요한 경우가 있다.
열심히 만들어서 인스톨 형식으로 배포하여 Program Files 영역에 설치하게 되면 요즘 윈도우는 보안수준이 올라가서 관리자 권한을 요구하기 때문에 Program Files 영역에 설정파일을 마음대로 썼다 지웠다 하기가 어렵다.
그래서 보통 대부분의 프로그램들은 C:\Users\유저명\AppData\Local 폴더에 설정파일들을 넣고 사용하도록 되어 있다.
%AppData%\Local 위치
Environment.SpecialFolder.LocalApplicationData
%AppData%\Roaming 위치
Environment.SpecialFolder.ApplicationData
using System.Configuration;
using System.Reflection.Assembly;
using System.IO;
------------------------------------------------------------
//저장위치 - C:\Users\사용자명\AppData\Local\프로젝트명\프로젝트버전\프로젝트명.config
string projectName = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
string projectVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
string configPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), projectName, projectVersion);
string configPathAndName = System.IO.Path.Combine(configPath, projectName + ".config");
//설정 파일 열기
private Configuration OpenConfiguration(string configFile)
{
Configuration config = null;
if (String.IsNullOrWhiteSpace(configFile))
{
config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
}
else
{
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = configFile;
config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
}
return config;
}
//설정 추가하기
public void SetAppConfig(string key, string val, string configFile)
{
try
{
Configuration config = this.OpenConfiguration(configFile);
if (config.AppSettings.Settings.AllKeys.Contains(key))
{
config.AppSettings.Settings[key].Value = val;
}
else
{
config.AppSettings.Settings.Add(key, val);
}
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.ToString());
}
}
public void SetAppConfig(string key, string val)
{
SetAppConfig(key, val, configPathAndName);
}
//설정 가져오기
public string GetAppConfig(string key, string configFile)
{
Configuration config = this.OpenConfiguration(configFile);
string val = String.Empty;
if (config.AppSettings.Settings.AllKeys.Contains(key))
{
val = config.AppSettings.Settings[key].Value;
}
return val;
}
public string GetAppConfig(string key)
{
return GetAppConfig(key, configPathAndName);
}
//설정 삭제하기
public void RemoveAppConfig(string key, string configFile)
{
Configuration config = this.OpenConfiguration(configFile);
if (config.AppSettings.Settings.AllKeys.Contains(key))
{
config.AppSettings.Settings.Remove(key);
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);
}
}
public void RemoveAppConfig(string key)
{
RemoveAppConfig(key, configPathAndName);
}
------------------------------------------------------------
//AppData\Local 위치 사용
{
// 추가하기
SetAppConfig("test1", "value1");
// 가져오기
string test1 = GetAppConfig("test1");
// 삭제하기
RemoveAppConfig("test1");
}
//실행파일 위치 사용
{
// 추가하기
SetAppConfig("test1", "value1", null);
// 가져오기
string test1 = GetAppConfig("test1", null);
// 삭제하기
RemoveAppConfig("test1", null);
}
'개발언어 > C#' 카테고리의 다른 글
[C#] 개인키 인증서 (정리하기) (0) | 2021.04.02 |
---|---|
[C#] listview drag & drop 설정 (0) | 2021.04.01 |
[C#] Static함수에서 Form의 Control 조작하는 방법 (0) | 2021.03.05 |
[C#] C#에서 멀티스레드에 안전한 구조 설계 (0) | 2021.02.17 |
[C#] Queue VS ConcurrentQueue (0) | 2021.02.17 |