Сохранение .config файла в произвольном месте
От: ALS78  
Дата: 07.07.06 06:13
Оценка: 2 (1)
Доброго времени суток!

У меня тут вопрос назрел. Использую конфиг файл для хранения настроек приложения, который по-умолчанию лежит рядом с ехе-шником. Открываю его с помощью :

ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);


Но это стратегически неверно, так как программа будет находиться в Program Files и далеко не каждый юзверь может туда писать.
Пытался открывать конфиг с указанием произвольной директории, например подставлял ту же Application Data. С произвольной директории не открывает. Ругается, что параметр exePath кривой.
С другой стороны, пытался использовать второй вариант, с роумингом пользователя:

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);


В этом случае открытие конфигурации происходит успешно, но при сохранении ругается на заблокированную секцию. С чего ради, спрашивается.

Так вот, как же все-таки сделать так, чтобы прога лежала там, где ей положено лежать, т.е. в Program Files, а конфиг файл с настройками валялся в Application Data пользователя?

То ли я тупой, то ли одно из двух. Хелп!

Юзаю C# + Framework 2.0
Re: Сохранение .config файла в произвольном месте
От: Ник  
Дата: 07.07.06 06:48
Оценка:
Я держу конфиг для своей проги тут:

FileStream fs = new FileStream(System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 
+ "\\" + Application.ProductName + "\\config.xml", FileMode.Open)
Re: Сохранение .config файла в произвольном месте
От: Lloyd Россия  
Дата: 07.07.06 06:49
Оценка: +4
Здравствуйте, ALS78, Вы писали:

ALS>То ли я тупой, то ли одно из двух. Хелп!


.config предназнчен для хранения настроек приложения, а не настроек пользователя. Поэтому просто не надо писать туда user-specific настройки.
Re[2]: Сохранение .config файла в произвольном месте
От: ALS78  
Дата: 07.07.06 10:30
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>.config предназнчен для хранения настроек приложения, а не настроек пользователя. Поэтому просто не надо писать туда user-specific настройки.


Ну не скажи. Зачем тогда нужен вариант с указанием юзер-специфик левел? (ConfigurationUserLevel)

Чтобы можно было настройки сохранять для локального или роуминг пользователя. Чтобы ты мог сесть за любую машину в домене и работать со своими роуминг настройками приложения. или я не прав?
Re[3]: Сохранение .config файла в произвольном месте
От: BOleg Россия  
Дата: 10.07.06 21:24
Оценка:
Здравствуйте, ALS78, Вы писали:

ALS>Чтобы можно было настройки сохранять для локального или роуминг пользователя. Чтобы ты мог сесть за любую машину в домене и работать со своими роуминг настройками приложения. или я не прав?


Прав.
appSettings.SectionInformation.AllowExeDefinition=System.Configuration.ConfigurationAllowExeDefinition.MachineToLocalUser;
В человечишке все должно быть прекрасненьким: и одёжка, и душенка, и мордочка, и мыслишки.
Re[4]: Сохранение .config файла в произвольном месте
От: ALS78  
Дата: 11.07.06 04:12
Оценка:
Здравствуйте, BOleg, Вы писали:

BO>
BO>appSettings.SectionInformation.AllowExeDefinition=System.Configuration.ConfigurationAllowExeDefinition.MachineToLocalUser;
BO>


Я так и не смог пока победить затык.
При запуске приложения открываю конфигурацию:


Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);


Смотрю в отладчике — секция AppSettings.IsLocked = true сразу же.
Соответственно пока она заблокирована, я не могу проставить ни одного свойства, в том числе и AllowExeDefinition. Информация о конфигурации также указывает, что файла конфигурация пока не имеет, что правильно в принципе, так как его и нет. (путь указан верно в Local Settings\Application Data\).
Я для приличия пытаюсь сразу же выполнить:

config.Save(ConfigurationSaveMode.Full, true);

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

Подскажите кто знает, плиз, как правильно открыть и настроить конфигурацию, чтобы можно было писать эти несчастные настройки пользователя? Я активно использую создание кастом секций и т.д. До тех пор пока конфиг валялся рядом с ехе, проблем не было. А перенаправить его в Local Settings не получается.
Re: Сохранение .config файла в произвольном месте
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 11.07.06 04:22
Оценка:
Здравствуйте, ALS78, Вы писали:

ALS>У меня тут вопрос назрел. Использую конфиг файл для хранения настроек приложения, который по-умолчанию лежит рядом с ехе-шником. ALS>То ли я тупой, то ли одно из двух. Хелп!

ALS>Юзаю C# + Framework 2.0

так используй user.config, он как раз там где надо лежит



см. также Ground Rules for Building Enhanced Windows Forms Support into Your .NET App (Improved Settings Management) и Client Settings FAQ
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Сохранение .config файла в произвольном месте
От: ALS78  
Дата: 11.07.06 04:37
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>так используй user.config, он как раз там где надо лежит


OE>


OE>см. также Ground Rules for Building Enhanced Windows Forms Support into Your .NET App (Improved Settings Management) и Client Settings FAQ



Ну дык к тому и стремлюсь. Не использую встроенный ГУЙ сеттингов в студии, потому что у меня свой SettingsManager, обладающий расширенным функционалом, который все умеет прекрасно делать. Затык то в том, что почему то при открытии конфигурации не глобально (для приложения), а локально (для пользователя) секция настроек приложения залочена. Именно это не получается разрешить.

А статейки те я уже излазил вдоль и поперек...
К тому же в примерах, что есть в инете и мсдн на ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal) не делается никакого особого ударения на что-то необычное с локом. Как обычно, открыл, изменил, записал. Ан нет, не выходит.
Re: Сохранение .config файла в произвольном месте
От: ALS78  
Дата: 12.07.06 06:29
Оценка:
Доброго времени суток!

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

Я руководствовался при ее решении следующими требованиями: писать настройки пользователя в 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
Оценка:
>Зачем тогда нужен вариант с указанием юзер-специфик левел
Эти как раз и хранятся в отдельном юзерском файле.
--
Абыpвалг! — сказал Linux после pyсификации


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Сохранение .config файла в произвольном месте
От: Аноним  
Дата: 07.07.06 13:43
Оценка:
У нас используется примерно такой код:
string app_config = CommandLine.GetArgumentValue("app_config");
if (string.IsNullOrEmpty(app_config))
{
applicationConfiguration = SystemConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
}
else
{
app_config = PathProcessor.GetFullPath(app_config);
if (!File.Exists(app_config))
{
applicationConfiguration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
}
else
{
ExeConfigurationFileMap config_file = new ExeConfigurationFileMap();
config_file.ExeConfigFilename = app_config;
applicationConfiguration = ConfigurationManager.OpenMappedExeConfiguration(config_file, ConfigurationUserLevel.None);
}
}
Deny everything...


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Сохранение .config файла в произвольном месте
От: Аноним  
Дата: 12.07.06 06:44
Оценка:
>>.config предназнчен для хранения настроек приложения, а не
>>настроек пользователя. Поэтому просто не надо писать туда
>>user-specific настройки.

Глупость какая! Он предназначен для пользовательских настроек приложения, на самом деле.

В FW2 шаблон настроек по-умолчанию хранится там же, где и EXE. А вот при первом старте настройки копируются в "Application Data" конкретного пользователя и потом уже берутся оттуда (если есть) пока приложение не поменяло путь. Для каждого пути хранится свой конфиг. Можно и выключить "пользовательский" конфиг. Так что изобретать велосипед не имеет никакого смысла.

| Мой Brainbench | BookReader 1.1 | Wallpaper Cycler |


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Сохранение .config файла в произвольном месте
От: Аноним  
Дата: 12.07.06 06:47
Оценка:
>>Спасибо всем, кто мне ответил и сподвиг на это решение.

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

Уж извини, если обидел, но документацию читать НАДО.

| Мой Brainbench | BookReader 1.1 | Wallpaper Cycler |


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Сохранение .config файла в произвольном месте
От: ALS78  
Дата: 14.07.06 04:50
Оценка:
Здравствуйте, BlackTigerAP, Вы писали:

BTA>Если бы ты внимательней читал документацию и другую литературу, то "сподвигаться" ни на что и не надо было бы. Это уже всё реализовано и без "велосипедов".


BTA>Уж извини, если обидел, но документацию читать НАДО.



Ну ка, ну ка подробнее...

Какие обиды, за помощью же обращался.

У меня прога вообще без каких-либо конфигов. Нету его просто напросто.
После того, как настройки будут заданы пользователем, надо их сохранить в этом самом конфиге. Причем не рядом с ехе в каких нить Program Files, на куда прав нет, а именно в Local Settings\Application Data.
Открытие конфигурации для локал юзера делает для меня AppSettings залоченными. И ничего я не могу записать. Знаешь как это сделать без велосипедов, подскажи лучше. РТФМ уже задолбал, так как не нашел я там для себя просвета.
Re[3]: Сохранение .config файла в произвольном месте
От: regint  
Дата: 03.08.06 16:17
Оценка:
ALS>Открытие конфигурации для локал юзера делает для меня AppSettings залоченными. И ничего я не могу записать. Знаешь как это сделать без велосипедов, подскажи лучше. РТФМ уже задолбал, так как не нашел я там для себя просвета.

Точно такая-же проблема!

И можно-ли зашифровывать некоторые поля, использую стандартный settings из студии?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Сохранение .config файла в произвольном месте
От: ALS78  
Дата: 04.08.06 03:02
Оценка:
Здравствуйте, regint, Вы писали:

ALS>>Открытие конфигурации для локал юзера делает для меня AppSettings залоченными. И ничего я не могу записать. Знаешь как это сделать без велосипедов, подскажи лучше. РТФМ уже задолбал, так как не нашел я там для себя просвета.


R>Точно такая-же проблема!


R>И можно-ли зашифровывать некоторые поля, использую стандартный settings из студии?


Не так давно была статейка Client Settings FAQ
Автор(ы): Raghavendra Prabhu
Дата: 30.07.2006
Одна из клевых новых фишек .NET 2.0/VS 2005 – простое в использовании, расширяемое API для управления настройками приложений и их пользователей, т.е. данными, которые должны сохраняться при работе клиентского приложения.
Несмотря на то, что новая фича достаточно прозрачна в использовании, мы часто получаем вопросы от пользователей, реализующих собственные сценарии ее использования — почему <это> работает так и как сделать, чтобы <то> работало немного по-другому.
опубликована по мотивам настроек приложения. Почитай ее. Мне лично стандартные сеттинги студии не подходят, потому что у меня свои кастом секции и группы есть. Потому я плясал не от Settings Api, скажем так, а от Configuration Api. Т.е. уровнем ниже. А насколько я понял, секция AppSettings доступна на запись только на уровне приложения, а для пользователя только для чтения. Потому и залочена. Так что это нормальное поведение. У меня в коде работает решение, о котором я уже писал выше. И не жалуюсь . Ну конечно пока не решил проблему с поврежденным конфигом, что я его замочить или перезаписать с помощью COnfiguration не могу. А "извращаться" и запоминать откатные версии не прельщает. Хотя придется, если не будет другого решения...

А про шифрацию полей не знаю, не копал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.