У меня тут вопрос назрел. Использую конфиг файл для хранения настроек приложения, который по-умолчанию лежит рядом с ехе-шником. Открываю его с помощью :
Но это стратегически неверно, так как программа будет находиться в Program Files и далеко не каждый юзверь может туда писать.
Пытался открывать конфиг с указанием произвольной директории, например подставлял ту же Application Data. С произвольной директории не открывает. Ругается, что параметр exePath кривой.
С другой стороны, пытался использовать второй вариант, с роумингом пользователя:
В этом случае открытие конфигурации происходит успешно, но при сохранении ругается на заблокированную секцию. С чего ради, спрашивается.
Так вот, как же все-таки сделать так, чтобы прога лежала там, где ей положено лежать, т.е. в Program Files, а конфиг файл с настройками валялся в Application Data пользователя?
Здравствуйте, Lloyd, Вы писали:
L>.config предназнчен для хранения настроек приложения, а не настроек пользователя. Поэтому просто не надо писать туда user-specific настройки.
Ну не скажи. Зачем тогда нужен вариант с указанием юзер-специфик левел? (ConfigurationUserLevel)
Чтобы можно было настройки сохранять для локального или роуминг пользователя. Чтобы ты мог сесть за любую машину в домене и работать со своими роуминг настройками приложения. или я не прав?
Re[3]: Сохранение .config файла в произвольном месте
Здравствуйте, ALS78, Вы писали:
ALS>Чтобы можно было настройки сохранять для локального или роуминг пользователя. Чтобы ты мог сесть за любую машину в домене и работать со своими роуминг настройками приложения. или я не прав?
Смотрю в отладчике — секция AppSettings.IsLocked = true сразу же.
Соответственно пока она заблокирована, я не могу проставить ни одного свойства, в том числе и AllowExeDefinition. Информация о конфигурации также указывает, что файла конфигурация пока не имеет, что правильно в принципе, так как его и нет. (путь указан верно в Local Settings\Application Data\).
Я для приличия пытаюсь сразу же выполнить:
config.Save(ConfigurationSaveMode.Full, true);
чтобы появился файлик, мож это разблокирует секцию, однако ж после выполнения сохранения файл так и не появился.
Подскажите кто знает, плиз, как правильно открыть и настроить конфигурацию, чтобы можно было писать эти несчастные настройки пользователя? Я активно использую создание кастом секций и т.д. До тех пор пока конфиг валялся рядом с ехе, проблем не было. А перенаправить его в Local Settings не получается.
Здравствуйте, ALS78, Вы писали:
ALS>У меня тут вопрос назрел. Использую конфиг файл для хранения настроек приложения, который по-умолчанию лежит рядом с ехе-шником. ALS>То ли я тупой, то ли одно из двух. Хелп! ALS>Юзаю C# + Framework 2.0
так используй user.config, он как раз там где надо лежит
Ну дык к тому и стремлюсь. Не использую встроенный ГУЙ сеттингов в студии, потому что у меня свой SettingsManager, обладающий расширенным функционалом, который все умеет прекрасно делать. Затык то в том, что почему то при открытии конфигурации не глобально (для приложения), а локально (для пользователя) секция настроек приложения залочена. Именно это не получается разрешить.
А статейки те я уже излазил вдоль и поперек...
К тому же в примерах, что есть в инете и мсдн на ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal) не делается никакого особого ударения на что-то необычное с локом. Как обычно, открыл, изменил, записал. Ан нет, не выходит.
Может кому пригодится мое решение обозначенной задачи, код приблизительный, просьба не придираться...
Я руководствовался при ее решении следующими требованиями: писать настройки пользователя в user.config и использовать при этом функционал AppSettingsSection.
// открываем настройки пользователя
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
// добавляем секцию наших настроек, если ее нет.if (config.Sections["MyUserSettings"] == null) {
AppSettingsSection section = new AppSettingsSection();
section.SectionInformation.AllowExeDefinition = ConfigurationAllowExeDefinition.MachineToLocalUser;
config.Sections.Add("MyUserSettings", section);
}
// а далее можем спокойно оперировать настройками, писать, читать и т.д.
AppSettingsSection section = (AppSettingsSection)config.Sections["MyUserSettings"];
string value = section.Settings["Prop1"].Value; // если настройки нет, будет null вместо проперти вам, так что проверяйтесь
Таким образом, как видно из кода, я добавляю свою секцию типа AppSettingsSection, позволяю ей работать на уровне пользователя (по-умолчанию, уровень приложения) и тогда она у меня не будет заблокированной, как "официальная секция" config.AppSettings, и я смогу ее сохранять.
ConfigurationUserLevel.PerUserRoamingAndLocal и ConfigurationAllowExeDefinition.MachineToLocalUser можно сменить в зависимости от ваших задач на другой уровень.
Спасибо всем, кто мне ответил и сподвиг на это решение.
Re[2]: Сохранение .config файла в произвольном месте
От:
Аноним
Дата:
07.07.06 11:00
Оценка:
>Зачем тогда нужен вариант с указанием юзер-специфик левел
Эти как раз и хранятся в отдельном юзерском файле.
>>.config предназнчен для хранения настроек приложения, а не >>настроек пользователя. Поэтому просто не надо писать туда >>user-specific настройки.
Глупость какая! Он предназначен для пользовательских настроек приложения, на самом деле.
В FW2 шаблон настроек по-умолчанию хранится там же, где и EXE. А вот при первом старте настройки копируются в "Application Data" конкретного пользователя и потом уже берутся оттуда (если есть) пока приложение не поменяло путь. Для каждого пути хранится свой конфиг. Можно и выключить "пользовательский" конфиг. Так что изобретать велосипед не имеет никакого смысла.
>>Спасибо всем, кто мне ответил и сподвиг на это решение.
Если бы ты внимательней читал документацию и другую литературу, то "сподвигаться" ни на что и не надо было бы. Это уже всё реализовано и без "велосипедов".
Уж извини, если обидел, но документацию читать НАДО.
Здравствуйте, BlackTigerAP, Вы писали:
BTA>Если бы ты внимательней читал документацию и другую литературу, то "сподвигаться" ни на что и не надо было бы. Это уже всё реализовано и без "велосипедов".
BTA>Уж извини, если обидел, но документацию читать НАДО.
Ну ка, ну ка подробнее...
Какие обиды, за помощью же обращался.
У меня прога вообще без каких-либо конфигов. Нету его просто напросто.
После того, как настройки будут заданы пользователем, надо их сохранить в этом самом конфиге. Причем не рядом с ехе в каких нить Program Files, на куда прав нет, а именно в Local Settings\Application Data.
Открытие конфигурации для локал юзера делает для меня AppSettings залоченными. И ничего я не могу записать. Знаешь как это сделать без велосипедов, подскажи лучше. РТФМ уже задолбал, так как не нашел я там для себя просвета.
Re[3]: Сохранение .config файла в произвольном месте
ALS>Открытие конфигурации для локал юзера делает для меня AppSettings залоченными. И ничего я не могу записать. Знаешь как это сделать без велосипедов, подскажи лучше. РТФМ уже задолбал, так как не нашел я там для себя просвета.
Точно такая-же проблема!
И можно-ли зашифровывать некоторые поля, использую стандартный settings из студии?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Сохранение .config файла в произвольном месте
Здравствуйте, regint, Вы писали:
ALS>>Открытие конфигурации для локал юзера делает для меня AppSettings залоченными. И ничего я не могу записать. Знаешь как это сделать без велосипедов, подскажи лучше. РТФМ уже задолбал, так как не нашел я там для себя просвета.
R>Точно такая-же проблема!
R>И можно-ли зашифровывать некоторые поля, использую стандартный settings из студии?
опубликована по мотивам настроек приложения. Почитай ее. Мне лично стандартные сеттинги студии не подходят, потому что у меня свои кастом секции и группы есть. Потому я плясал не от Settings Api, скажем так, а от Configuration Api. Т.е. уровнем ниже. А насколько я понял, секция AppSettings доступна на запись только на уровне приложения, а для пользователя только для чтения. Потому и залочена. Так что это нормальное поведение. У меня в коде работает решение, о котором я уже писал выше. И не жалуюсь . Ну конечно пока не решил проблему с поврежденным конфигом, что я его замочить или перезаписать с помощью COnfiguration не могу. А "извращаться" и запоминать откатные версии не прельщает. Хотя придется, если не будет другого решения...