Конфигурационные файлы C # - PullRequest
5 голосов
/ 02 июня 2009

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

Что я здесь не так делаю?

РЕДАКТИРОВАТЬ: Значение configFileName равно "email.config"

Ответы [ 5 ]

5 голосов
/ 02 июня 2009

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

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

Спасибо всем, КрисФ, Эоин Кэмпбелл и Паблито.

2 голосов
/ 02 июня 2009

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

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

UPDATE

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

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

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

0 голосов
/ 29 октября 2010
externalConfig.AppSettings.Settings["SSL"].Value = ssl.ToString();

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

просто мой 2с для тех, кто пытается этот код.

0 голосов
/ 02 июня 2009

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

0 голосов
/ 02 июня 2009

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

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

, например

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...