fasonzo Ответов: 3

Проблема с записью файла config


В моей программе в VB.net, а не C или C # я читаю свой конфигурационный файл, например, так:

Imports System.Configuration
Imports System.Collections.Specialized
Imports System.Collections.Generic

Module Module1

    Sub LeggiConfig()

        Dim sAttr As String

        sAttr = ConfigurationSettings.AppSettings("Key1") ' li legge ad uno ad uno
        Console.WriteLine("The value of Key1: " & sAttr)
        
        end sub
   End Module


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>

  <appSettings>
    
    <add key="Key0" value="0" />
    <add key="Key1" value="1" />
    <add key="Key2" value="2" />
  </appSettings>
  
</configuration>


Я хотел бы изменить этот параметр Key1 и попробовал следующие способы:

ConfigurationSettings.AppSettings.Set(("Key1"), "pippo" & " ")
My.Settings.Save()
 sAttr = ConfigurationSettings.AppSettings("Key1") ' li legge ad uno ad uno
       Console.WriteLine("The value of Key1: " & sAttr)


если я пишу так в консоли, то вижу значение pippo, но в конфигурационном файле оно все равно остается начальным значением, которое было 1

если вместо этого я добавлю эту строку:

' ConfigurationSettings.AppSettings.Add(("Key1"), "pippo" & " ")


У меня есть такая ошибка:

Система.Конфигурация.ConfigurationErrorsException: "конфигурация только для чтения".

как это решается?

Что я уже пробовал:

Вы не могли бы мне помочь?

как я ни старался я написал это выше

3 Ответов

Рейтинг:
2

Dave Kreskowiak

Файл .config обычно находится в той же папке, что и приложение, в разделе Program Files. Все, что находится в разделе Program Files, доступно только для чтения обычным пользователям, включая ваш файл .config. Администраторы на компьютере не имеют такого ограничения, пока код выполняется с повышенными разрешениями ("Запуск от имени администратора").

Это плохая идея-открывать разрешения в разделе Program Files, чтобы пользователи могли писать в конфигурационный файл. Вы можете поместить свои дополнительные настройки "все пользователи на компьютере" для вашего приложения в его собственный конфигурационный файл в папке под C:\ProgramData и/или "пользовательские" настройки в собственном конфигурационном файле в папке профиля пользователя. Какие именно папки подходят, зависит от ситуации, в которой пользователи должны использовать приложение.

Проверять Окружающая среда.Перечисление Специальных Папок (System) | Microsoft Docs[^] для расположения папок вы можете получить пути к ним и то, для чего они обычно используются, а также Окружающая среда.Метод GetFolderPath (System) | Microsoft Docs[^] для того, как разрешить эти значения в пути к папкам.

Кстати, ConfigurationSettings теперь устарел и был заменен на Диспетчер конфигураций[^].


Рейтинг:
2

OriginalGriff

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

Если это не исправит ситуацию, посмотрите сюда: Стив Микелотти: ConfigurationErrorsException - конфигурация доступна только для чтения[^] - ненавижу это говорить, но это на C#, но это может помочь: Преобразователь кода C# в VB и VB в C# – Telerik[^]


MadMyche

У меня были подобные проблемы, и я обнаружил, что "запуск от имени администратора" обычно может исправить ситуацию

OriginalGriff

Это сработает, но это кувалда, чтобы расколоть орех разрешений! :смеяться:

MadMyche

Древнее приложение... одноразовые настройки.... нет бюджета, чтобы сделать правильный ремонт

Рейтинг:
0

Richard Deeming

Даже если у вас есть разрешение на редактирование конфигурационного файла, вы не можете просто записать его в файл конфигурации. AppSettings коллекция. Вы должны открыть конфигурацию EXE, изменить настройки на этом экземпляре, сохранить этот экземпляр, а затем обновить основной файл. ConfigurationManager настройки:

Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
KeyValueConfigurationCollection settings = configFile.AppSettings.Settings;

if (settings["Key1"] == null)
{
    settings.Add("Key1", "pippo");
}
else
{
    settings["Key1"].Value = "pippo";
}

configFile.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);

в C# - конфигурации.AppSettings - как изменить и сохранить? - переполнение стека[^]