WPF / C #: где я должен сохранять файлы пользовательских настроек? - PullRequest
53 голосов
/ 28 декабря 2008

В каком месте рекомендуется сохранять файлы пользовательских настроек? Есть ли рекомендуемый метод для работы с пользовательскими настройками?

В настоящее время я использую путь, возвращенный из typeof(MyLibrary).Assembly.Location, в качестве местоположения по умолчанию для хранения файлов, созданных или требуемых приложением.

EDIT: Я нашел два связанных / интересных вопроса:

РЕДАКТИРОВАТЬ # 2: Это просто примечание для таких людей, как я, которые никогда раньше не пользовались настройками. Настройки довольно полезны, но мне пришлось проделать целую кучу копаний, чтобы выяснить, что происходит (пришло из мира Python, не то, что я тоже использовал). Все усложнилось, так как я хотел сохранить словари, и, по-видимому, их нельзя сериализовать. Настройки также сохраняются в 3 разных файлах в зависимости от того, что вы делаете. Существует файл app.config, user.config и settings.setting. Итак, вот еще две ссылки, которые я нашел полезными:

Ответы [ 4 ]

69 голосов
/ 28 декабря 2008

Вы можете использовать настройки приложения достаточно легко.

Если вы еще этого не сделали, просто щелкните правой кнопкой мыши по проекту и выберите «Свойства». Выберите вкладку «Настройки». Убедитесь, что вы выбрали «Пользователь» для области (в противном случае настройка доступна только для чтения).

Код для доступа к этому прост:

forms.Width = Application1.Properties.Settings.Default.Width;

Если вам нужно сохранить его:

Application1.Properties.Settings.Default.Width = forms.Width;
Application1.Properties.Settings.Default.Save();

В приведенном выше примере Width - это имя пользовательской настройки, которое вы определяете на вкладке Settings, а Application1 - пространство имен вашего приложения.

Редактировать: Отвечая на дополнительные вопросы

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

У вас есть пара ссылок, которые немного запутывают ситуацию. Ваш оригинальный вопрос, где сохранить «Файлы предпочтений пользователя». Я вполне уверен, что намерение Microsoft с функциональностью «Настройки» заключается именно в том, чтобы ... хранить настройки скина пользователя, варианты макета и т. Д. Он не имел в виду универсальный репозиторий для данных приложения, хотя таким способом можно было легко злоупотреблять.

Данные хранятся в отдельных местах по уважительной причине. Некоторые из настроек являются настройками приложения и доступны только для чтения. Это настройки, которые должны работать в приложении, но не привязанные к конкретному пользователю (например, URI для ресурсов приложения или, возможно, налоговая ставка). Они хранятся в app.config.

Пользовательские настройки хранятся в скрытом каталоге глубоко в папке User Document / Settings. Значения по умолчанию хранятся в app.config (я думаю, я не могу их вспомнить наверняка), но любые пользовательские изменения хранятся в их личной папке. Это предназначено для данных, которые изменяются от пользователя к пользователю. (Под «пользователем» я имею в виду пользователя Windows, а не пользователя вашего приложения.)

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

27 голосов
/ 28 декабря 2008

При работе от имени не-администратора или в Vista вы не можете записывать в папку «Program Files» (или любую ее подпапку).

Правильное расположение для сохранения пользовательских настроек (замените MyCompanyName и MyApplicationName на правильные имена, очевидно)

На диске:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\MyCompanyName\\MyApplicationName"

Или в реестре под ключом:

 HKEY_CURRENT_USER\Software\MyCompanyName\MyApplicationName

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

Если вам нужно общее местоположение для всех пользователей, тогда:

  1. Это будет работать только тогда, когда пользователь работает от имени администратора
  2. На Vista не будет надежно работать
  3. Вы должны обо всем позаботиться самостоятельно (например, два пользователя одновременно запускают приложение на одном компьютере с помощью быстрого переключения пользователей).

и местоположения:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationCommonData) + "\\MyCompanyName\\MyApplicationName"

Или в реестре под ключ:

 HKEY_LOCAL_MACHINE\Software\MyCompanyName\MyApplicationName
3 голосов
/ 30 декабря 2008

Вы можете использовать изолированное хранилище. Вы можете изолировать по пользователю, сборке и / или домену.

Введение в изолированное хранилище
http://msdn.microsoft.com/en-us/library/3ak841sy(VS.80).aspx

Типы изоляции
http://msdn.microsoft.com/en-us/library/eh5d60e1(VS.80).aspx

1 голос
/ 02 августа 2010

следующий вариант кажется наилучшим:

Application.UserAppDataPath
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...