Program Tip

.NET 응용 프로그램에 대한 사용자 설정을 저장하는 가장 좋은 방법은 무엇입니까?

programtip 2020. 12. 8. 19:53
반응형

.NET 응용 프로그램에 대한 사용자 설정을 저장하는 가장 좋은 방법은 무엇입니까?


.NET 2.0 Windows Forms 응용 프로그램이 있습니다. 상점 사용자 설정이 가장 좋은 위치는 어디입니까 (Windows 지침 고려)?

어떤 사람들은 Application.LocalUserAppDataPath. 그러나 다음과 같은 폴더 구조가 생성됩니다.

C : \ Documents and Settings \ user_name \ Local Settings \ Application Data \ company_name \ product_name \ product_version \

내 애플리케이션의 버전 1을 릴리스하고 거기에 XML 파일을 저장하면 릴리스 버전 2가 다른 폴더로 변경됩니다. 응용 프로그램 버전에 관계없이 설정을 저장하기 위해 사용자 당 하나의 폴더를 갖고 싶습니다.


기본 제공 응용 프로그램 설정 사용을 좋아 합니다 . 그런 다음 디자인 타임 또는 런타임에 사용하려는 경우 설정 디자이너 사용에 대한 지원을 내장했습니다.

// read setting
string setting1 = (string)Settings.Default["MySetting1"];
// save setting
Settings.Default["MySetting2"] = "My Setting Value";

// you can force a save with
Properties.Settings.Default.Save();

설명하는 것과 유사한 폴더 구조에 설정을 저장합니다 (경로에 버전 포함). 그러나 다음을 간단히 호출하면됩니다.

Properties.Settings.Default.Upgrade(); 

앱은 저장하기 위해 모든 이전 버전 설정을 가져옵니다.


.NET 응용 프로그램에는 사용하기 쉬운 기본 제공 설정 메커니즘이 있습니다. 제 생각에 문제는 이러한 설정을 다소 모호한 디렉토리에 저장하고 최종 사용자가 찾을 수 없다는 것입니다. 또한 디버그에서 릴리스 빌드로 전환하기 만하면이 디렉터리의 위치가 변경되므로 한 구성에 저장된 모든 설정이 다른 구성에서 손실됩니다.

이러한 이유와 다른 이유로 Windows Forms에 대한 자체 설정 코드를 만들었습니다 . .NET과 함께 제공되는 것만 큼 매끄럽지는 않지만 더 유연하고 항상 사용합니다.


또는 xml 파일에 설정을 작성하고 격리 된 저장소를 사용하여 저장 합니다. 사용하는 상점에 따라 Application Data 폴더에 저장합니다. 로밍 가능 저장소를 선택할 수도 있습니다. 즉, 사용자가 다른 컴퓨터에 로그온하면 설정도 함께 이동합니다.


과거에 저에게 도움이 된 한 가지 접근 방식은 설정 클래스를 만들고 XML 직렬화를 사용하여 파일 시스템에 쓰는 것이 었습니다. 설정 개체 컬렉션을 만들고 직렬화하여이 개념을 확장 할 수 있습니다. 파일 시스템 관리에 대해 걱정할 필요없이 모든 사용자에 대한 모든 설정을 한 곳에서 사용할 수 있습니다.

누군가 나에게 바퀴를 부분적으로 재창조 한 것에 대해 약간의 결함을주기 전에 몇 가지 말을하겠습니다. 하나의 경우 파일을 직렬화하고 작성하는 데 몇 줄의 코드 만 있으면됩니다. 둘째, 설정이 포함 된 개체가있는 경우 앱을로드 할 때 appSettings 개체를 여러 번 호출 할 필요가 없습니다. 마지막으로, 애플리케이션 상태를 나타내는 항목을 매우 쉽게 추가 할 수 있으므로 다음에 애플리케이션이로드 될 때 장기 실행 작업을 재개 할 수 있습니다.


내 설정을 단순히 텍스트 파일에 저장하는 몇 가지 방법을 시도하고 가장 좋은 방법을 찾았습니다.

응용 프로그램 폴더에 저장된 파일, 사용, settings.txt : (설정 파일 승인 된 주석 내부, // comment 시도)

// 설정 값 얻기

Settings.Get("name", "Ivan");

// 설정 값 설정

Settings.Set("name", "John");

사용 :

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

// 섹션 이름과 함께 저장할 수도 있으며 이름 섹션 Set (section_name, name, value) 및 Get (section_name, name, value) 만 추가하면됩니다.

public static class Settings
{
    private static string SECTION =  typeof(Settings).Namespace;//"SETTINGS";
    private static string settingsPath = Application.StartupPath.ToString() + "\\settings.txt";
    [DllImport("kernel32")]
    private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
    public static String GetString(String name)
    {
        StringBuilder temp = new StringBuilder(255);
        int i = GetPrivateProfileString(SECTION,name,"",temp,255,settingsPath);
        return temp.ToString();
    }
    public static String Get(String name, String defVal)
    {
        return Get(SECTION,name,defVal);
    }
    public static String Get(string _SECTION, String name, String defVal)
    {
        StringBuilder temp = new StringBuilder(255);
        int i = GetPrivateProfileString(_SECTION, name, "", temp, 255, settingsPath);
        return temp.ToString();
    }
    public static Boolean Get(String name, Boolean defVal)
    {
        return Get(SECTION, name, defVal);
    }
    public static Boolean Get(string _SECTION, String name, Boolean defVal)
    {
        StringBuilder temp = new StringBuilder(255);
        int i = GetPrivateProfileString(_SECTION,name,"",temp,255,settingsPath);
        bool retval=false;
        if (bool.TryParse(temp.ToString(),out retval))
        {
            return retval;
        } else
        {
            return retval;
        }
    }
    public static int Get(String name, int defVal)
    {
        return Get(SECTION, name, defVal);
    }
    public static int Get(string _SECTION, String name, int defVal)
    {
        StringBuilder temp = new StringBuilder(255);
        int i = GetPrivateProfileString(SECTION,name,"",temp,255,settingsPath);
        int retval=0;
        if (int.TryParse(temp.ToString(),out retval))
        {
            return retval;
        } else
        {
            return retval;
        }
    }
    public static void Set(String name, String val)
    {
        Set(SECTION, name,val);
    }
    public static void Set(string _SECTION, String name, String val)
    {
        WritePrivateProfileString(_SECTION, name, val, settingsPath);
    }
    public static void Set(String name, Boolean val)
    {
        Set(SECTION, name, val);
    }
    public static void Set(string _SECTION, String name, Boolean val)
    {
        WritePrivateProfileString(_SECTION, name, val.ToString(), settingsPath);
    }
    public static void Set(String name, int val)
    {
        Set(SECTION, name, val);
    }
    public static void Set(string _SECTION,String name, int val)
    {
        WritePrivateProfileString(SECTION, name, val.ToString(), settingsPath);
    }
}

설정은 표준 키-값 쌍 (문자열-문자열)입니다. 도움이된다면 XML 파일로 래핑 할 수 있습니다.

차라리 레지스트리 대신 파일 시스템을 사용하고 싶습니다. 유지 관리가 더 쉬운 것 같습니다. 지원 시나리오에서 사용자가 수동으로 설정을 열거 나 변경해야하는 경우 파일 시스템에 있으면 더 쉬울 것입니다.


Isolated storage is primarily used for applications distributed using ClickOnce and are run in a secure sandbox. The base path is decided for you and you won't be able infer it in your code. The path will be something like "\LocalSettings\ApplicationData\IsolatedStorage\ejwnwe.302\kfiwemqi.owx\url.asdaiojwejoieajae....", not all that friendly. Your storage space is also limited.

Ryan Farley has it right.


I'd go down the folder list you posted except for the product version. You don't want the settings reset after an update is released.

I'm actually moving away from the registry for user settings because of the debug/footprint factor. I'm currently only storing a few basic settings (window size, position, version of a data file) in the registry, and I've run into more problems if an update goes bad or a user loses a second monitor and that is where the application was opening to. A few of them are savvy enough to understand regedit, but for the rest they have to do a reinstall, which is quick, but I think they grumble a bit. With the file based version, all I'd have to do is have them open up an XML file in Notepad and make a quick tweak.

In addition, I'm looking to make my application runnable off a USB flash drive, and having the settings tied into the file seems much friendlier to that process. I'm sure I can do some code to check/clean the registry, but I think most of us are already tired of the registry clutter that seems to eat up our machines nowadays.

I know there are some security tradeoffs to this, but none of the data I'm sorting is that critical to that cause, and I'm not suffering any performance hits due to the size of the application.

참고URL : https://stackoverflow.com/questions/26369/what-is-the-best-way-to-store-user-settings-for-a-net-application

반응형