Как сохранить настройки приложения c
теперь я хочу сохранить значение пути в файл для последующего использования. Это будет один из многих параметров, сохраненных в этом файле. Этот файл будет находиться непосредственно в папке приложения.
Я понимаю, что есть три варианта доступно:
- ConfigurationSettings file (appname.исполняемый.config)
- реестр
- пользовательский XML-файл
Я видел другие дискуссии на эту тему, но мне все еще не ясно.
если вы работаете с Visual Studio, то это довольно легко получить устойчивые настройки. Щелкните правой кнопкой мыши проект в обозревателе решений, выберите Свойства. Выберите вкладку Настройки, нажмите на гиперссылку, если настройки не существуют. Используйте вкладку Параметры для создания параметров приложения. Visual Studio создает файлы Settings.settings и Settings.Designer.settings , которые содержат одноэлементный класс Settings наследуется от ApplicationSettingsBase. Вы можете получить доступ к этому классу из кода для чтения/записи настройки приложения:
этот метод применим как для консоли, Windows Forms, так и для других типов проектов.
обратите внимание, что вам нужно установить scope свойства параметры. Если вы выберете область применения, то настройки.По умолчанию. будет доступно только для чтения.
Если вы планируете сохранить в файл в том же каталоге, что и исполняемый файл, вот хорошее решение, которое использует JSON:
The ApplicationSettings класс не поддерживает сохранение настроек приложения.конфигурационный файл. Это очень много по дизайну, приложения, которые работают с должным образом защищенной учетной записью пользователя (думаю, Vista UAC) не имеют доступа на запись в папку установки программы.
Вы можете бороться с системой с ConfigurationManager класса. Но тривиальный обходной путь состоит в том, чтобы войти в конструктор настроек и изменить область настройки на пользователя. Если это вызывает трудности (скажем, настройка актуальна для каждого пользователя), вы следует поместить функцию параметров в отдельную программу, чтобы вы могли запросить запрос на повышение привилегий. Или отказаться от использования настроек.
Я хотел поделиться библиотекой, которую я построил для этого. Это крошечная библиотека, но большое улучшение (ИМХО) закончилось .файл настроек.
библиотека называется Jot (GitHub), вот статья проекта кода я писал об этом.
вот как вы будете использовать его, чтобы отслеживать размер и расположение окна:
преимущество по сравнению С.файлы настроек: там значительно меньше кода, и это много менее подвержены ошибкам, так как вам нужно только упомянуть каждое свойство после.
с файлами настроек вам нужно упомянуть каждое свойство пять раз: один раз, когда вы явно создаете свойство и дополнительные четыре раза в коде, который копирует значения туда и обратно.
хранение, сериализация и др. полностью настраиваются. При использовании инверсия управления, вы можете подключить его так, чтобы он применял отслеживание автоматически для всех объектов он разрешается так, что все, что вам нужно сделать, чтобы сделать свойство постоянным, это пощечина [отслеживаемый] атрибут на нем.
Я пишу все это, потому что я думаю, что библиотека на высшем уровне, и я хотел бы популяризировать его:)
аргумент registry/configurationSettings/XML по-прежнему кажется очень активным. Я использовал их все, как технология прогрессировала, но мой любимый основан на Threed все!--5--> в сочетании с Изолированное Хранилище.
следующий пример позволяет хранить объекты с именем свойства в файле в изолированном хранилище. Например:
свойства могут быть восстановлены с помощью:
это просто образец, не наводящий на размышления наилучшие виды практики.
17.11.2011 | Автор Bestlisпростой способ-использовать объект данных конфигурации, сохранить его в виде XML-файла с именем приложения в локальной папке и при запуске прочитать его обратно.
вот пример для хранения позиции и размера формы.
конфигурация dataobject строго типизирована и проста в использовании:
класс менеджера для сохранения и загрузки:
теперь вы можете создать экземпляр и использовать его в загрузке и закрытии формы события:
и полученный XML-файл также читается:
Давайте рассмотрим, каким образом можно добавить настройки к приложению. Вызовите контектсное меню проекта (рис. 1) и выберите пункт Poperties (Свойства)
Имейте в виду, что пользовательские настройки можно изменять во время выполнения программы, то есть их можно считывать и записывать. Программные настройки доступны только для чтения и изменять их можно только при разработке приложения или путем изменения файла настроек вручную.
Давайте создадим настройки, которые будут отвечать за размер окна приложения, фоновый цвет и настройки шрифта. Для этого добавте следующие настройки:
Name | Type | Scope | Value |
backgroundColor | System.Drawing.Color | User | Control |
FormWidth | int | User | 300 |
FormHeight | int | User | 200 |
FormFont | System.Drawing.Font | User | Microsoft Sans Serif; 8,25pt |
Должно получиться похожее как на рисунке:
Рис. 3 Гавная форма приложения
Рис. 4 Форма «Настройки приложения» Перейдем непосредственно к коду программы. Для нашей формы, создадим обработчик события Load. В этом обработчике мы будем загружать все настройки приложения:
Сразу, как говорится, не отходя от кассы, подпишемся на обработчик события FormClosing и в нем будем сохранять все настройки при закрытии приложения:
Обратите внимание на строчку
Метод Save сохраняет настройку в файле настроек. Без использования этого метода, настройки будут работать только в текущей сессии. Сами настройки хранятся в файле App.config который можно посмотреть в Visual Studio (это обычный XML файл с записанными в нем нашими настройками).
Теперь перейдем к форме Настроек. Здесь мы и будем настраивать все наши параметры.
В обработчике события Load загружаем настройки
В обработчике события кнопки изменения цвета всё просто:
Создадем свойство, с помощью которого будем передавать выбранный цвет в главную форму.
С шрифтом аналогичная ситумация.
С формой настроек мы закончили. Возвращаемся к главной форме из которой мы будем вызывать окно настроек. Делать мы это будем из обработчика события для пункта меню «Настройки»:
Вот и все. Запустите приложение и попробуйте поизменять размеры формы, цвет и настройки шрифта. При последующем открытии формы все сделанные настройки сохраняются.
Сохранение настроек Приложения - это одно из первых действий, которое изучают новички при работе с фреймворком Qt. Для этого используется класс QSettings, который позволяет сохранять настройки либо в реестр операционной системы, либо в текстовый файл. В данном уроке будет использован самый простой вариант - это сохранение настроек в реестр операционной системы. Для обеспечения наглядности работы сохранения настроек в данном уроке использовался проект из урока по QSystemTrayIcon .
Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1 под Windows.
Структура проекта
Проект создается как Приложение Qt Widgets, в котором по умолчанию создаются файлы:
- Settings.pro - профайл;
- mainwindow.h - заголовочный файл основного окна приложения;
- mainwindow.cpp - исходный код окна;
- main.cpp - основной исходный файл, с которого стартует приложение;
- mainwindow.ui - формочка основного окна приложения.
Примечание. Большую часть интерфейса создаю в дизайнере, чтобы не загромождать логику основного кода лишней информацией. По сути это лишь дело вкуса и привычки.
mainwindow.ui
Создаем формочку для теста, в которой будут использоваться два следующих объекта:
- trayCheckBox - чекбокс для настройки поведения приложения;
- saveButton - кнопка для выполнения сохранения настроек Приложения;
Settings.pro
По-прежнему в уроках не вносится изменений профайл проекта.
main.cpp
Данный файл подвергается изменениям, поскольку при запуске программы необходимо внести информацию о Приложении в реестр операционной системы.
mainwindow.h
Помимо методов и объектов, использованных в уроке по QSystemTrayIcon в данный файл необходимо внести Слот для обработки нажатия кнопки, в котором будет производиться сохранение настроек.
Также необходимо подключить в проект заголовочные файлы следующих классов:
И прописать директивы define, которые будут использоваться при работе с QSettings.
mainwindow.cpp
В данном классе производится выполнение восстановления настроек приложения при инициализации внешнего вида главного окна, а также сохранение настроек по нажатию по кнопке saveButton.
Итог по уроку QSettings
При успешном написании кода из урока, при нажатии кнопки сохранения настроек, настройки сохранятся в реестр операционной системы.
А после перезапуска приложения настройки будут восстановлены. Если при сохранении настроек чекбокс был отмечен, то при запуске приложения он также будет отмечен. И приложение будет вести себя в соответствии с настройками.
Теперь я хочу сохранить значение пути в файл для дальнейшего использования. Это будет одна из многих настроек, сохраненных в этом файле. Этот файл будет находиться прямо в папке приложения.
Насколько я понимаю, доступны три варианта:
- Файл ConfigurationSettings (appname.exe.config)
- Реестр
- Пользовательский файл XML
Означает ли это, что я должен использовать собственный XML-файл для сохранения настроек конфигурации?
Я видел и другие дискуссии на эту тему, но мне это все еще непонятно.
Вам нужно сохранить значения паролей или секретов ? Может потребоваться какое-то шифрованиеЕсли вы работаете с Visual Studio, довольно легко получить постоянные настройки. Щелкните правой кнопкой мыши проект в обозревателе решений и выберите «Свойства». Выберите вкладку «Настройки» и щелкните гиперссылку, если настройки не существуют.
Используйте вкладку «Настройки» для создания настроек приложения. Visual Studio создает файлы Settings.settings и Settings.Designer.settings , которые содержат одноэлементный класс Settings , унаследованный от ApplicationSettingsBase. Вы можете получить доступ к этому классу из своего кода для чтения / записи настроек приложения:
Этот метод применим как для консоли, так и для Windows Forms и других типов проектов.
Обратите внимание, что вам необходимо установить свойство scope в ваших настройках. Если вы выберете Область применения, тогда Settings.Default. будет только для чтения.
Если у меня есть решение, будет ли это применяться ко всему решению или к каждому проекту? @Four: когда я изменил настройку с User на Application-scope и сохранил файл, я увидел в сгенерированном коде сеттер исчез. Это также происходит с профилем клиента 4.0 . @Four: отличная ссылка, хотя ваше утверждение о том, что Settings.Default.Save() ничего не делает, неверно. Как заявляет @aku в ответе, настройки области действия приложения доступны только для чтения: сохранение для них неэффективно. Используйте этот пользовательский PortableSettingsProvider, чтобы сохранить область действия пользователя. в файл app.config, расположенный там, где находится исполняемый файл, а не в папке AppData пользователя. Нет, в целом не очень хорошо, но я использую его во время разработки, чтобы использовать одни и те же настройки от компиляции к компиляции (без этого они переходят в новые уникальные пользовательские папки с каждой компиляцией). На данный момент с .NET 3.5 кажется, что вы можете просто использовать Settings.Default.SomeProperty, чтобы присвоить значение и получить сильное приведение типов. Кроме того, чтобы сэкономить время других (мне потребовалось некоторое время, чтобы понять это), вам нужно либо ввести Properties.Settings.Default, либо добавить using YourProjectNameSpace.Settings в начало файла. Только "Настройки" не определены / не найдены.Если вы планируете сохранить файл в том же каталоге, что и ваш исполняемый файл, вот хорошее решение, использующее JSON формат:
Да, измените DEFAULT_FILENAME на абсолютный путь, если вы хотите сохранить в другой каталог. Я думаю, что чаще всего файл сохраняется в том же каталоге, что и приложение, или в подкаталоге, если вы не сохраняете их в реестре. О, возможно, лучшим вариантом было бы сохранить файл настроек в папке appdata пользователя. Не нужно менять DEFAULT_FILENAME , просто позвоните settings.Save(theFileToSaveTo) ; Предполагается, что DEFAULT_FILENAME заглавными буквами является константой . Если вам нужно свойство чтения-записи, создайте его и задайте конструктору значение DEFAULT_FILENAME . Затем укажите значение аргумента по умолчанию null , проверьте это и используйте свое свойство в качестве значения по умолчанию. Это немного больше набора текста, но дает вам более стандартный интерфейс. Вам потребуется ссылка на System.Web.Extensions.dll , если вы еще этого не сделали.Реестр запрещен. Вы не уверены, имеет ли пользователь, использующий ваше приложение, достаточные права для записи в реестр.
Вы можете использовать файл app.config для сохранения настроек уровня приложения (которые одинаковы для всех пользователей, использующих ваше приложение).
Я бы сохранил пользовательские настройки в XML-файле, который будет сохранен в Изолированное хранилище или в SpecialFolder. ApplicationData.
Однако используйте реестр, если вам нужны настройки для каждого входа / пользователя. @thenonhacker: или используйте Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData) В реестр пользователей можно записывать (множество программ записывают туда информацию, и разрешения пользователей никогда не являются проблемой). Преимущество использования реестра перед настройками заключается в том, что если у вас есть несколько приложений, совместно использующих одну и ту же папку (например, программа установки и программа приложения), они не будут использовать одни и те же настройки. Основным недостатком реестра является сложность экспорта / копирования настроек на другой компьютер. Но я не согласен с тем, что «Вы не уверены, имеет ли пользователь, который использует ваше приложение, достаточные права для записи в реестр» - в HKEY_CURRENT_USER у вас всегда есть права на запись. Это может быть запрещено, но файловая система также может быть недоступна для текущего пользователя (все возможные папки TEMP и т. Д.).Класс ApplicationSettings не поддерживает сохранение настроек в файл app.config . Это очень задумано; приложения, которые запускаются с должным образом защищенной учетной записью (например, Vista UAC), не имеют права записи в папку установки программы.
Вы можете бороться с системой с помощью класса ConfigurationManager . Но тривиальный обходной путь - войти в конструктор настроек и изменить область действия параметра на Пользователь. Если это вызывает трудности (скажем, настройка актуальна для каждого пользователя), вам следует поместить функцию «Параметры» в отдельную программу, чтобы вы могли запросить запрос на повышение привилегий. Или откажитесь от настройки.
Не могли бы вы расширить свое последнее предложение? Попросите повышения прав, чтобы написать app.config или написать отдельное приложение, которое будет проходить через домашние поисковые системы всех пользователей, искать user.config и редактировать их? Отдельная программа требует манифеста для запроса повышения. Погуглите asinvoker requireadministrator, чтобы найти правильный синтаксис. Редактировать user.config нецелесообразно и не нужно.Аргумент registry / configurationSettings / XML все еще кажется очень активным. Я использовал их все по мере развития технологии, но мой любимый основан на Система Threed в сочетании с Изолированное хранилище.
Следующий пример позволяет хранить объекты с именем properties в файле в изолированном хранилище. Такие как:
Свойства могут быть восстановлены с помощью:
Это всего лишь образец, не предлагающий лучших практик.
Или еще лучше; использовать DataContractJsonSerializerЯ хотел поделиться библиотекой, которую я создал для этого. Это крошечная библиотека, но большое улучшение (ИМХО) по сравнению с файлами .settings.
Библиотека называется Jot (GitHub). Вот старая статья в Code Project, о которой я писал.
Вот как вы могли бы использовать его для отслеживания размера и местоположения окна:
Преимущество по сравнению с файлами .settings: значительно меньше кода и меньше подвержено ошибкам, поскольку вам нужно упомянуть каждое свойство только один раз .
В файлах настроек вам нужно упомянуть каждое свойство пять раз: один раз, когда вы явно создаете свойство, и еще четыре раза в коде, который копирует значения туда и обратно.
Хранение, сериализация и т. Д. Полностью настраиваются. Когда целевые объекты создаются контейнером IoC, вы можете [подключить] [] так что он применяет отслеживание автоматически ко всем объектам, которые он разрешает, так что все, что вам нужно сделать, чтобы сделать свойство постоянным, - это добавить к нему атрибут [Trackable].
Его легко настраивать, и вы можете настроить: - когда данные сохраняются и применяются глобально или для каждого отслеживаемого объекта - как они сериализуются - где они хранятся (например, файл, база данных, онлайн, изолированное хранилище, реестр) - правила, которые могут отменять применение / сохраняющиеся данные для свойства
Поверьте, библиотека на высшем уровне!
Простой способ - использовать объект данных конфигурации, сохранить его как файл XML с именем приложения в локальной папке и при запуске прочитать его обратно.
Вот пример сохранения положения и размера формы.
Объект данных конфигурации строго типизирован и прост в использовании:
Класс менеджера для сохранения и загрузки:
Теперь вы можете создать экземпляр и использовать в своей форме события загрузки и закрытия:
И созданный XML-файл также доступен для чтения:
У меня это отлично работает в разработке, но когда я развертываю приложение, средний пользователь не имеет доступа к папке c:\program files\my application , поэтому сохранение настроек вызывает ошибку. Вместо этого я пытаюсь сохранить XML-файл в AppData, но мне просто интересно, есть ли очевидный способ решения этой проблемы, поскольку этот подход, похоже, сработал для вас. Поскольку это всего лишь обычный файл, вы можете сохранить его где угодно. Просто найдите место с доступом для записи. Спасибо, я это уже реализовал, сохранив xml-файл в папке AppDate. Мне просто интересно, есть ли простой способ сохранить его в папке приложения в соответствии с вашим примером, поскольку я предполагал, что вы заставили его работать. Не волнуйтесь, папка AppData, вероятно, в любом случае лучше!Мне не нравится предлагаемое решение с использованием web.config или app.config . Попробуйте прочитать свой собственный XML. Взгляните на Файлы настроек XML - больше никакого web.config .
Другие варианты, вместо использования настраиваемого файла XML, мы можем использовать более удобный для пользователя формат файла: файл JSON или YAML.
Вы можете сохранить свой файл настроек в нескольких специальных папках (для всех пользователей и для каждого пользователя), как указано здесь Environment.SpecialFolder Enumeration и несколько файлов (по умолчанию только для чтения, для каждой роли, для каждого пользователя и т. д.)
Если вы решите использовать несколько настроек, вы можете объединить эти настройки: например, объединение настроек по умолчанию + BasicUser + AdminUser. Вы можете использовать свои собственные правила: последнее переопределяет значение и т. Д.
«Означает ли это, что я должен использовать собственный XML-файл для сохранения настроек конфигурации?» Нет, не обязательно. Для таких операций мы используем SharpConfig.
Например, если такой файл конфигурации
Мы можем получить такие значения
Очень хороший ответ и спас мне день. Спасибо! Как изменить этот файл с помощью кода, если мне нужно добавить дополнительные параметры? еще раз спасибо.Да, можно сохранить конфигурацию, но это во многом зависит от того, как вы это сделаете. Позвольте мне описать технические различия, чтобы вы могли понять, какие у вас есть варианты:
Во-первых, вам нужно различать, хотите ли вы использовать applicationSettings или AppSettings в вашем файле *.exe.config (он же App.config в Visual Studio) - там фундаментальные отличия описаны здесь.
Оба предоставляют разные способы сохранения изменений:
-
AppSettings позволяют читать и записывать непосредственно в файл конфигурации (через config.Save(ConfigurationSaveMode.Modified); , где конфигурация определяется как config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ).
Примечание. Как упоминалось в вопросе, существует третий вариант: если вы рассматриваете файл конфигурации как документ XML , вы можете загружать, изменять и сохраните его с помощью System.Xml.Linq.XDocument класс. Нет необходимости использовать собственный XML-файл, вы можете прочитать существующий файл конфигурации; для запроса элементов вы даже можете использовать запросы Linq. Я привел пример здесь , проверьте функцию GetApplicationSetting есть в ответе.
Если вам требуется шифрование для защиты ваших ценностей , ознакомьтесь с этим отвечать. В нем описывается, как использовать DPAPI от Microsoft для хранения зашифрованных значений.
Читайте также: