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

Итак, некоторое время назад я написал, как читать другие файлы конфигурации других программ (вот ссылка Предыдущий пост. Мне удалось это сделать. Но теперь другая проблема. Ситуация такая, у меня две программы. Программа A читает свою конфигурацию из конфиг-файла и программа < strong>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".


person akif    schedule 02.06.2009    source источник


Ответы (5)


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

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

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

person akif    schedule 02.06.2009
comment
ты разобрался ;-) извини не удержался :) - person fretje; 02.06.2009

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

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

ОБНОВЛЕНИЕ

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

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

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

person ChrisF    schedule 02.06.2009
comment
Я обращаюсь к файлу конфигурации только по имени файла, потому что он находится в том же каталоге. - person akif; 02.06.2009
comment
Что ж, если он находится в другой папке, вам нужно будет получить к нему доступ по полному пути. - person ChrisF; 02.06.2009
comment
Я не обращаюсь к файлу, я просто сохраняю его путь в ключе в файле конфигурации. Пожалуйста, прочитайте мой код, и я прокомментировал место, где возникает исключение. - person akif; 02.06.2009
comment
Не видя значения configMap, я не могу думать ни о чем другом. - person ChrisF; 02.06.2009
comment
Значением configFileName является email.config. - person akif; 02.06.2009
comment
Это моя точка зрения. Если он находится в другой папке, это должно быть что-то вроде: C:\Folder1\Folder2\email.config - person ChrisF; 02.06.2009
comment
Только с именем файла код будет искать в текущей папке (т.е. в папке, где запущен exe) и не найдет его. Отсюда исключение. - person ChrisF; 02.06.2009
comment
Но файл конфигурации находится в том же каталоге. Файл, который я получаю из другого OpenFileDialog, не используется для открытия файла конфигурации. Я просто храню его в файле конфигурации. - person akif; 02.06.2009
comment
Я сейчас в замешательстве, хотя я думаю, что мы говорим о разных вещах здесь. ОК - какое значение хранится в файле конфигурации? - person ChrisF; 02.06.2009
comment
Извините, да, я знаю, что это сбивает с толку. Путь к файлу, который я получаю из OpenFileDialog, должен храниться в файле конфигурации. - person akif; 02.06.2009
comment
Оглядываясь назад на ваш код, я не уверен, какая строка вызывает исключение. Это создание configMap или когда он используется? - person ChrisF; 02.06.2009
comment
И это полный путь, который хранится? - person ChrisF; 02.06.2009
comment
Можете ли вы уточнить, какая строка вызывает исключение? - person ChrisF; 02.06.2009
comment
Именно эта строка externalConfig.AppSettings.Settings[ServerAddress].Value = serverAddr; - person akif; 02.06.2009

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

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

e.g.

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

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

person Eoin Campbell    schedule 02.06.2009
comment
Ну, я думаю, ты неправильно меня истолковал. Я говорю, что файл конфигурации находится в том же каталоге, и я могу получить к нему доступ. Проблема возникает, когда путь к файлу, который я получаю из OpenFileDialog, находится за пределами каталога исполняемого файла. Но, но путь к файлу, который я получаю из диалогового окна, является полным путем, и я не использую этот путь к файлу. Все, что я делаю, это просто храню его в ключе. Но я не могу этого сделать - person akif; 02.06.2009

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

person Pablo Retyk    schedule 02.06.2009

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

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

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

person Andrew Rokicki    schedule 29.10.2010