App config c как добавить
Перейти к содержимому

App config c как добавить

  • автор:

Путь к файлу через app.config

Знаю как в си шарпе указать путь к файлам, но это будет работать только на моем пк, при переносе программы на другой пк путь будет другой. Как можно правильно прописать путь к файлу через app.config что бы работало на разных пк?

Отслеживать
Joshua Higgs
задан 8 авг 2018 в 8:33
Joshua Higgs Joshua Higgs
55 7 7 бронзовых знаков

а что вы уже сделали? Вас интересует как получить строку с адресом, или вам нужно внести строку с адресом, или что? Ваш вопрос слишком общий что-бы дать на него однозначный и точный ответ!

8 авг 2018 в 8:36
Клади файлы в общие папки по типу AppData
8 авг 2018 в 8:38

Есть программа которая работает с файлами, сортирует и удаляет их, на моем пк делает это по одному пути, на другой машине путь будет другой. Интересует как сделать так, что бы не прописывать каждый раз новый путь, а в этом appconfig указать универсальный доступ к этим файлам @VladimirT

8 авг 2018 в 8:56
Хорошо, намекну, выложите сюда файл app.config, и обработчик который у вас получает данные!
8 авг 2018 в 9:11
в вопрос добавьте (отредактируйте)!
8 авг 2018 в 9:19

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Есть возможность указать относительный путь к нужному файлу.

К примеру, у вас исполняемый файл называется main.exe . Вам, например, нужно указать путь к файлу texture.png , находящемуся в папке img . Структура решения (проекта) VS для C# будет примерно такой:

/MyProject /bin main.exe /img texture.png main.cs 

Тогда относительный путь к файлу можно определить так:

String path = "..\\img\\texture.png" 

Отслеживать
ответ дан 8 авг 2018 в 8:56
Andrei Khotko Andrei Khotko
4,915 18 18 серебряных знаков 53 53 бронзовых знака

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

App.Config и Custom Configuration Sections

Данная статья может показаться банальной, но иногда что-то полезное забывается, а читать на импортном языке лень и книжки под рукой нет. Поэтому я, обратившись к гуглу, нашел хорошее описание процесса создания обработчика конфигурационной секции файла app.config в .net приложениях, перевел его, дополнил замечаниями (курсив) и комментариями и решил опубликовать.

Я уверен, что многим из вас приходилось использовать файл конфигурации App.Config для хранения инициализирующих или конфигурационных данных приложения. И я так же уверен в том, что многим из вас хотелось создать в данном файле свои собственные структуры для хранения настроек. Но в итоге приходилось использовать встроенные возможности секции и получать значения, используя конструкцию вида:

 ConfigurationManager.AppSettings["MyKey"] 

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

  1. ConfigurationSection — Этот объект вернет нам пользовательскую секцию.
  2. ConfigurationElementCollection — Это собственно коллекция элементов, которые мы определим в пользовательской секции.
  3. ConfigurationElement — Это сам элемент, описывающий какую-от определенную вами сущность.

Первое, что нам потребуется сделать, это добавить в наше приложение файл app.Config (если, конечно, вы этого еще не сделали). После чего открываем данный файл и копипастим следующий код между тегами :

Замечание: данная секция должна располагаться в самом начале файла конфигурации, т.е. сразу после тега , иначе будут ошибки инициализации конфигурации.

Далее создадим нашу собственную секцию, которая будет реализовывать нашу собственную модель данных:

Замечание: если кому-то не нравиться добавление узлов командой add в данном примере, то всегда можно сделать свой собственный префикс, используя следующий код:

 [ConfigurationCollection( typeof( FolderElement ) ), AddItemName = "Folder"] public class FoldersCollection : ConfigurationElementCollection  

при определении коллекции элементов в структуре данных. Тогда в конфигурационном файле можно будет писать так:

Закончим модификации в файле конфигурации и перейдем к организации взаимодействия нашего приложения с ним.

Первым делом создадим класс-наследник от ConfigurationSection, что позволит нам взаимодействовать с нашей секцией в файле конфигурации через ConfigurationManager во время исполнения программы.

 public class StartupFoldersConfigSection : ConfigurationSection < [ConfigurationProperty( "Folders" )] public FoldersCollection FolderItems < get < return ( (FoldersCollection)( base[ "Folders" ] ) ); >> > 

Атрибут ConfigurationProperty( «Folders» ) требуется для сопоставления свойства FolderItems с корневым узлом нашей структуры данных.

Класс FoldersCollection является наследником ConfigurationElementCollection, который обеспечивает взаимодействие с коллекцией наших элементов, описанных в app.config. Определяется класс так:

 [ConfigurationCollection( typeof( FolderElement ) )] public class FoldersCollection : ConfigurationElementCollection < protected override ConfigurationElement CreateNewElement() < return new FolderElement(); >protected override object GetElementKey( ConfigurationElement element ) < return ( (FolderElement)( element ) ).FolderType; >public FolderElement this[int idx ] < get> > 

Последним нам нужно создать ConfigurationElement, класс который свяжет нас с конечными данными, определенными в конфигурационном файле.

 public class FolderElement : ConfigurationElement < [ConfigurationProperty("folderType", DefaultValue="", IsKey=true, IsRequired=true)] public string FolderType < get set > [ConfigurationProperty( "path", DefaultValue = "", IsKey = false, IsRequired = false )] public string Path < getset > > 

Атрибут ConfigurationProperty(«folderType») требуется для того, что бы проассоциировать имя xml-атрибута в файле конфигурации. Остальные параметры атрибута такие как DefaultValue="", IsKey=true, IsRequired=true определяют только различные опции применимые к свойствам.

Замечание: автор умалчивает, что при стандартном способе использования сеттер свойства FolderType, работать не будет, т.к. файл конфигурации обычно доступен только на чтение. Для того что бы представлялось возможным производить запись в файл конфигурации следует делать, например, так:

 Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); StartupFoldersConfigSection section = (StartupFoldersConfigSection)cfg.Section["StartupFolders"]; if ( section != null ) < System.Diagnostics.Debug.WriteLine( section.FolderItems[0].FolderType ); System.Diagnostics.Debug.WriteLine( section.FolderItems[0].Path ); section.FolderItems[0].Path = "C:\\Nanook"; cfg.Save(); //устанавливает перенос на новую строку и производит проверку .vshost.exe.config файла в вашей отладочной папке. > 

Итак, мы имеем все необходимые данные и классы, которые предоставляют нам возможность хранить в конфигурационном файле app.config пользовательскую структуру данных.
Использовать данный подход можно так:

 StartupFoldersConfigSection section = (StartupFoldersConfigSection)ConfigurationManager.GetSection( "StartupFolders" ); if ( section != null )

При этом не забываем прописать System.Configuration в список подключаемых пространств имен.

  • app.config
  • конфигурация .net
  • конфигурационная секция
  • ConfigurationSection

App config c как добавить

Как правило, для хранения конфигурации в приложении ASP.NET Core используются файлы json. Для работы с файлами json применяется провайдер JsonConfigurationProvider , а для загрузки конфигурации из json применяется метод расширения AddJsonFile() .

По умолчанию в проекте уже есть файл конфигурации json - appsettings.json , а также appsettings.Development.json , которые загружаются по умолчанию в приложении и которые мы можем использовать для хранения конфигурационных настроек.

Файл appsettings.json и appsettings.Development.json в ASP.NET Core и C#

Например, код файла appsettings.json:

 < "Logging": < "LogLevel": < "Default": "Information", "Microsoft.AspNetCore": "Warning" >>, "AllowedHosts": "*" >

Здесь определяются настройки логгирования (элемент "Logging") и разрешенные хосты (элемент "AllowedHosts"). Одни элементы могут иметь вложенные элементы. Аналогичным образом можно задать другие необходимые настройки или удалить ранее определенные.

Однако в данном случае для примера возьмем новый файл json. Итак, добавим в проект новый файл config.json :

Конфигурация json в ASP.NET Core и C#

И определим в нем следующее содержимое:

Здесь задается два элемента с ключами "person" и "company". Используем эти настройки в приложении:

var builder = WebApplication.CreateBuilder(); var app = builder.Build(); builder.Configuration.AddJsonFile("config.json"); app.Map("/", (IConfiguration appConfig) => $" - "); app.Run();

Для установки конфигурации из json-файла название файла передается в метод AddJsonFile() .

Конфигурация из файла json в ASP.NET Core и C#

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

builder.Configuration .AddJsonFile("config.json") .AddJsonFile("otherconfig.json");

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

Но json может хранить также более сложные по составу объекты, например:

< "person": >, "company": < "name": "Microsoft">>

И чтобы обратиться к этой настройке, нам надо использовать знак двоеточия для обращения к иерархии настроек:

var builder = WebApplication.CreateBuilder(); var app = builder.Build(); builder.Configuration.AddJsonFile("config.json"); app.Map("/", (IConfiguration appConfig) => < var personName = appConfig["person:profile:name"]; var companyName = appConfig["company:name"]; return $"- "; >); app.Run();

Конфигурация в XML

За использование конфигурации в XML-файле отвечает провайдер XmlConfigurationProvider . Для загрузки xml-файла применяется метод расширения AddXmlFile() .

Итак, добавим в проект новый xml-файл, который назовем config.xml . Затем изменим его код на следующий:

  Tom Microsoft  

Здесь определены два элемента person и company, которые представляют конфигурационные настройки.

Обратите внимание, что у файла xml в свойствах должно быть выставлено копирование при компиляции в выходную папку приложения:

Конфигурация из файла XML в ASP.NET Core и C#

Теперь используем этот файл:

var builder = WebApplication.CreateBuilder(); var app = builder.Build(); builder.Configuration.AddXmlFile("config.xml"); app.Map("/", (IConfiguration appConfig) => $" - "); app.Run();

Если у нас файл конфигурации имеет разные уровни вложенности, например:

    Tomas toma@gmail.com   Microsoft   

то мы можем обращаться к этим уровням также, как и в файле json:

app.Map("/", (IConfiguration appConfig) => < var personName = appConfig["person:profile:name"]; var companyName = appConfig["company:name"]; return $"- "; >);

Конфигурация в ini-файлах

Для работы с конфигурацией INI применяется провайдер IniConfigurationProvider . А для загрузки конфигурации из INI-файла нам надо использовать метод расширения AddIniFile() .

Например, добавим в проект текстовый файл и переименуем его в config.ini .

Конфигурация из файла ini в ASP.NET Core и C#

Определим в этом файле следующее содержимое:

person="Bob" company="Microsoft"

Подключим конфигурацию из этотого файла в приложении:

var builder = WebApplication.CreateBuilder(); var app = builder.Build(); builder.Configuration.AddIniFile("config.ini"); app.Map("/", (IConfiguration appConfig) => $" - "); app.Run();

Конфигурационные секции. Web.config и App.config для «C# продолжающих».

Картинка блога

Этим постом я начну короткий цикл статей о конфигурационных файлах. Казалось бы, что может быть проще редактирования конфиг файлов, тем не менее есть несколько моментов, которые могут показаться сложными для начинающего или даже неизвестными для «продолжающего си шарпера». Нет, это статья не о мало известных секциях и даже не о том том как круто можно загружать чужие конфиги или сохранять их программно. Обо всем по порядку:

Пример собственной секции

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

1. Создем класс наследник от ConfigurationSection:

public class ConsoleConfigSection : ConfigurationSection < public static ConsoleConfigSection GetConfig() < return (ConsoleConfigSection)ConfigurationManager. GetSection("console") ?? new ConsoleConfigSection(); >[ConfigurationProperty("kvp")] public NameValueConfigElementCollection Kvp < get < return (NameValueConfigElementCollection)this["kvp"] ?? new NameValueConfigElementCollection(); >> [ConfigurationProperty("prop", IsKey = true, IsRequired = true)] public string Prop < get < return this["prop"] as string; >> >

Для наглядности, тут 2 поля: kvp — коллекция, и name — обычное свойство.

2. Создаем класс коллекции. Наследник от ConfigurationElementCollection

Этот класс описывает коллекцию с дополнительным свойством disabled.

public class NameValueConfigElementCollection : ConfigurationElementCollection < public NameValueConfigElement this[int index] < get < return base.BaseGet(index) as NameValueConfigElement; >set < if (base.BaseGet(index) != null) < base.BaseRemoveAt(index); >this.BaseAdd(index, value); > > protected override ConfigurationElement CreateNewElement() < return new NameValueConfigElement(); >protected override object GetElementKey(ConfigurationElement element) < return ((NameValueConfigElement)element).Name; >[ConfigurationProperty("disabled", IsKey = true)] public bool Disabled < get < return (bool)this["disabled"]; >> >

3. Создаем класс описывающий свойства в коллекции. Наследник класса ConfigurationElement

Этот класс описывает свойства одного элемента в коллекции.В этом примере у него одно поле обязательно — name а одно — value — нет.

public class NameValueConfigElement : ConfigurationElement < [ConfigurationProperty("name", IsKey = true, IsRequired = true)] public string Name < get < return this["name"] as string; >> [ConfigurationProperty("value", IsRequired = false)] public string Value < get < return this["value"] as string; >> >

4. Тестируем

Для этого нужно добавить описание секции и саму секцию в конфигурационный файл

В итоге, читаем секцию из кода:

ConsoleConfigSection.GetConfig().Kvp .Cast() .Select(x => x.Name).ToArray();

В следующей статье я расскажу как шифровать любую секцию.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *