Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Файлы конфигурации С#

Автор вопроса: akifОтветов: 5

Итак, некоторое время назад я написал, как читать другие файлы конфигурации других программ (вот ссылка Предыдущий пост. Мне удалось это сделать. Но теперь другая проблема. Ситуация такая, у меня две программы. Программа A читает свою конфигурацию из конфиг-файла и программа B используется только для изменения содержимого файла конфигурации, который читает A. Имя файла конфигурации - email.config. Он находится в тот же каталог, в котором находятся программы A и B.

Проблема в том, что я получаю путь к файлу для вложения, используя диалог открытия файла. Если путь указывает на файл в том же каталоге, программа работает отлично! Но если он указывает на файл вне каталога, он генерирует исключение типа System.NullReferenceException.

Вот код

private void saveBtn_Click(object sender, EventArgs e)
{
    try
    {
        // save everything and close
        string attachment = attachTxtBox.Text;

        var configMap = new ExeConfigurationFileMap { ExeConfigFilename = configFileName };
        // it throws exception here when
        // the path points to a file outside the exes directory
        Configuration externalConfig = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);

        externalConfig.AppSettings.Settings["ServerAddress"].Value = serverAddr;
        externalConfig.AppSettings.Settings["Port"].Value = port;
        externalConfig.AppSettings.Settings["SSL"].Value = ssl.ToString();
        externalConfig.AppSettings.Settings["Sender"].Value = senderAddr;
        externalConfig.AppSettings.Settings["SenderPassword"].Value = password;
        externalConfig.AppSettings.Settings["Subject"].Value = subject;
        externalConfig.AppSettings.Settings["AttachmentPath"].Value = attachment;
        externalConfig.AppSettings.Settings["Body"].Value = messageBody;

        // Save values in config
        externalConfig.Save(ConfigurationSaveMode.Full);
        Application.Exit();
    }
    catch (System.Exception ex)
    {
        MessageBox.Show("Error: " + ex.Message);
        Application.Exit();
    }
}

Содержимое email.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings file="">
    <clear />
    <add key="ServerAddress" value="" />
    <add key="Port" value="" />
    <add key="Sender" value="" />
    <add key="SenderPassword" value="" />
    <add key="Subject" value="" />
    <add key="AttachmentPath" value="" />
    <add key="Body" value="" />
  </appSettings>
</configuration>

Что я здесь делаю неправильно?

EDIT: значением configFileName является "email.config".

fileconfig

Ответы

Ответ 1 · рейтинг 5 · akif

Ну я сам разобрался после отладки почти 5 часов, Блин!

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

Спасибо всем, ChrisF, Eoin Campbell и pablito.

Ответ 2 · рейтинг 2 · ChrisF

Вы обращаетесь к файлу по его полному пути или только по имени файла?

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

ОБНОВЛЕНИЕ

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

externalConfig.AppSettings.Settings["ServerAddress"].Value = serverAddr;

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

Ответ 3 · Eoin Campbell

Какой код вы используете для возврата FileName и Path из OpenFileDialog.

Это полный путь к файлу?

e.g.

openFileDialog1.FileName; //Contains "C:\\Path\\To\\The\\File.txt"

Судя по всему, сохраняется только имя файла, поэтому ваше приложение просматривает только текущий путь.

Ответ 4 · Pablo Retyk

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

Ответ 5 · Andrew Rokicki

externalConfig.AppSettings.Settings["SSL"].Value = ssl.ToString();

Файл конфигурации не содержит "SSL"

просто мой 2c для тех, кто пробует этот код.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы