Вопрос:

Каков наилучший способ хранения пользовательских настроек для приложения .NET?

c# .net

40127 просмотра

8 ответа

973 Репутация автора

У меня есть приложение Windows Forms .NET 2.0. Где лучше всего хранить пользовательские настройки магазина (с учетом рекомендаций Windows)?

Некоторые люди указали на Application.LocalUserAppDataPath. Тем не менее, это создает структуру папок, как:

C: \ Documents and Settings \ имя_пользователя \ Локальные настройки \ Данные приложения \ имя_компании \ product_name \ product_version \

Если я выпускаю версию 1 своего приложения и сохраняю там XML-файл, а затем выпускаю версию 2, это изменится в другую папку, верно? Я бы предпочел иметь одну папку для каждого пользователя для хранения настроек независимо от версии приложения.

Автор: LeoD Источник Размещён: 25.08.2008 04:43

Ответы (8)


0 плюса

973 Репутация автора

Настройки - это стандартные пары ключ-значение (строка-строка). Я мог бы обернуть их в файл XML, если это поможет.

Я бы предпочел использовать файловую систему вместо реестра. Кажется, легче поддерживать. В сценариях поддержки, если пользователю необходимо вручную открыть / изменить настройки, это будет проще, если он находится в файловой системе.

Автор: LeoD Размещён: 25.08.2008 04:48

0 плюса

24463 Репутация автора

Я бы пошел вниз по списку папок, который вы опубликовали, за исключением версии продукта. Вы не хотите сбрасывать настройки после выпуска обновления.

Я фактически отошел от реестра для пользовательских настроек из-за фактора отладки / следа. В настоящее время я храню только несколько основных настроек (размер окна, положение, версия файла данных) в реестре, и я столкнулся с большим количеством проблем, если обновление выходит из строя или пользователь теряет второй монитор, и именно здесь заявка открывалась для. Некоторые из них достаточно сообразительны, чтобы понять regedit, но в остальном они должны сделать переустановку, которая происходит быстро, но я думаю, что они немного ворчат. С файловой версией все, что мне нужно сделать, - это открыть XML-файл в Блокноте и быстро настроить его.

Кроме того, я хочу, чтобы мое приложение работало с флэш-накопителя USB, и привязка настроек к файлу кажется гораздо более удобной для этого процесса. Я уверен, что могу сделать некоторый код для проверки / очистки реестра, но я думаю, что большинство из нас уже устали от беспорядка реестра, который, по-видимому, в настоящее время пожирает наши машины.

Я знаю, что в этом есть некоторые компромиссы в отношении безопасности, но ни одна из данных, которые я сортирую, не имеет такого критического значения, и я не испытываю никаких падений производительности из-за размера приложения.

Автор: Dillie-O Размещён: 25.08.2008 04:50

81 плюса

10593 Репутация автора

Решение

Я люблю использовать встроенные настройки приложения . Затем вы встроили поддержку использования дизайнера настроек, если хотите использовать во время разработки или во время выполнения:

// 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(); 

Приложение сохранит все настройки предыдущих версий, чтобы сохранить их.

Автор: Ryan Farley Размещён: 25.08.2008 04:59

2 плюса

7489 Репутация автора

Один подход, который работал для меня в прошлом, состоял в том, чтобы создать класс настроек и использовать сериализацию XML для записи его в файловую систему. Вы можете расширить эту концепцию, создав коллекцию объектов настроек и сериализовав ее. У вас будут все ваши настройки для всех пользователей в одном месте, не беспокоясь об управлении файловой системой.

Прежде, чем кто-либо даст мне какую-либо ошибку за частичное переизобретение колеса, позвольте мне сказать несколько вещей. Во-первых, это всего несколько строк кода для сериализации и записи файла. Во-вторых, если у вас есть объект, который содержит ваши настройки, вам не нужно совершать несколько вызовов объекта appSettings при загрузке приложения. И, наконец, очень легко добавлять элементы, представляющие состояние ваших приложений, что позволяет вам возобновить долгосрочную задачу при следующей загрузке приложения.

Автор: Jason Z Размещён: 25.08.2008 05:06

5 плюса

38661 Репутация автора

Или запишите свои настройки в XML-файл и сохраните его, используя изолированное хранилище . В зависимости от используемого вами магазина, он сохраняет его в папке «Данные приложения». Вы также можете выбрать хранилище с поддержкой роуминга, которое означает, что когда пользователь входит в систему на другом компьютере, настройки перемещаются вместе с ним.

Автор: Lars Truijens Размещён: 25.08.2008 05:11

0 плюса

0 Репутация автора

Изолированное хранилище в основном используется для приложений, распространяемых с помощью ClickOnce, и запускается в защищенной изолированной программной среде. Базовый путь решен за вас, и вы не сможете определить его в своем коде. Путь будет что-то вроде "\ LocalSettings \ ApplicationData \ IsolatedStorage \ ejwnwe.302 \ kfiwemqi.owx \ url.asdaiojwejoieajae ....", не все, что дружелюбно. Ваше место для хранения также ограничено.

Райан Фарли понял это правильно .

Автор: user1010 Размещён: 25.08.2008 09:45

8 плюса

44275 Репутация автора

Приложения .NET имеют встроенный механизм настроек, который прост в использовании. Проблема с этим, на мой взгляд, в том, что он хранит эти настройки в довольно непонятном каталоге, и конечные пользователи не смогут его найти. Более того, простое переключение с отладочной на выпускную сборку изменяет местоположение этого каталога, а это означает, что все настройки, сохраненные в одной конфигурации, будут потеряны в другой.

По этим и другим причинам я разработал собственный код настроек для Windows Forms . Он не такой приятный, как тот, который поставляется с .NET, но он более гибкий, и я использую его постоянно.

Автор: Jonathan Wood Размещён: 21.03.2011 03:00

1 плюс

139 Репутация автора

Я пытаюсь использовать некоторые методы, чтобы сохранить мои настройки в текстовом файле, и я нашел лучший способ:

файл, сохраненный в папке приложения, для использования, settings.txt : (внутри файла настроек одобрены комментарии, попробуйте // комментарий)

// чтобы получить значение настроек

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);
    }
}
Автор: vitalinvent Размещён: 25.06.2015 08:02
32x32