Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как лучше всего хранить пользовательские настройки для приложения .NET?
У меня есть .NET 2.0 Windows бланков заявки. Где лучше всего разместить настройки пользователя магазина (учитывая рекомендации Windows)?
Некоторые люди указывали на Application.LocalUserAppDataPath . Однако это создает структуру папок, как:
C:\Documents и 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 приложения имеют встроенный механизм настройки, который прост в использовании. Проблема с ним, на мой взгляд, заключается в том, что он хранит эти настройки в довольно неясном каталоге, и конечные пользователи не смогут его найти. Кроме того, простое переключение с debug на release build изменяет расположение этого каталога, что означает, что любые настройки, сохраненные в одной конфигурации, теряются в другой.
По этим и другим причинам я придумал свой собственный код настроек для Windows форм . Он не совсем такой гладкий, как тот, который поставляется с .NET, но он более гибкий, и я использую его все время.
Или запишите свои настройки в файл xml и сохраните его с помощью изолированного хранилища . В зависимости от используемого хранилища он сохраняет его в папке данных приложения. Вы также можете выбрать хранилище с включенным роумингом, что означает, что при входе пользователя на другой компьютер параметры перемещаются вместе с ними.
Один из подходов, который работал для меня в прошлом, заключался в создании класса настроек и использовании сериализации XML для записи его в файловую систему. Вы можете расширить эту концепцию, создав коллекцию объектов настроек и сериализовав ее. Вы будете иметь все свои настройки для всех пользователей в одном месте, не беспокоясь об управлении файловой системой.
Прежде чем кто-нибудь даст мне какой-нибудь отпор за частичное повторное изобретение колеса, позвольте мне сказать несколько вещей. Во-первых, это всего лишь несколько строк кода для сериализации и записи файла. Во-вторых, если у вас есть объект, содержащий ваши настройки, вам не нужно делать несколько вызовов объекта appSettings при загрузке приложения. И, наконец, очень легко добавлять элементы, представляющие состояние ваших приложений, что позволяет вам возобновить длительную работу, когда приложение загружается в следующий раз.
Я попробовал некоторые методы, чтобы сохранить мои настройки в простой текстовый файл, и я нашел лучший способ:
файл, хранящийся в папке приложения, для использования, settings.txt : (внутри файла настроек одобренные комментарии, попробуйте //comment)
//to получить значение настроек
Settings.Get("name", "Ivan");
//to установить значение настроек
Settings.Set("name", "John");
с помощью:
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
//you можно хранить также с названием раздела, для использования, просто добавьте название раздела(section_name,имя,значение) и получить(section_name,имя,значение)
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);
}
}
Изолированное хранилище в основном используется для приложений, распределенных с использованием ClickOnce и работающих в безопасной песочнице. Базовый путь определяется для вас, и вы не сможете определить его в своем коде. Путь будет выглядеть примерно так: "\LocalSettings\ApplicationData\IsolatedStorage\ejwnwe.302\kfiwemqi.owx\url.asdaiojwejoieajae....", не все так дружелюбно. Ваше место для хранения также ограничено.
Настройки - это стандартные пары ключ-значение (строка-строка). Я мог бы завернуть их в файл XML, если это поможет.
Я бы предпочел использовать файловую систему вместо Реестра. Кажется, его легче поддерживать. В сценариях поддержки, если пользователю нужно вручную открыть / изменить настройки, это будет проще, если он находится в файловой системе.
Я бы пошел вниз по списку папок, который вы опубликовали, за исключением версии продукта. Вы не хотите, чтобы настройки были сброшены после выпуска обновления.
На самом деле я удаляюсь от реестра для пользовательских настроек из-за фактора отладки/следа. В настоящее время я храню только несколько основных настроек (размер окна, положение, версия файла данных) в реестре, и я столкнулся с большим количеством проблем, если обновление идет плохо или пользователь теряет второй монитор, и именно туда открывалось приложение. Некоторые из них достаточно сообразительны, чтобы понять regedit, но для rest они должны сделать переустановку, которая происходит быстро, но я думаю, что они немного ворчат. С файловой версией все, что мне нужно сделать, это открыть файл XML в блокноте и сделать быструю настройку.
Кроме того, я хочу сделать свое приложение доступным для запуска с диска USB flash, и привязка настроек к файлу кажется гораздо более дружественной к этому процессу. Я уверен, что могу сделать некоторый код для проверки/очистки реестра, но я думаю, что большинство из нас уже устали от беспорядка реестра, который, кажется, съедает наши машины в настоящее время.
Я знаю, что есть некоторые компромиссы в области безопасности, но ни одна из данных, которые я сортирую, не имеет такого критического значения для этой причины, и я не страдаю от каких-либо сбоев производительности из-за размера приложения.