Pergunta

Ok, então um tempo antes que eu postei como ler outros arquivos de configuração de outros programas (aqui está o link Post Anterior . Eu consegui fazê-lo. Mas agora há outro problema. O cenário é assim, eu tenho dois programas. Programa a lê sua configuração de um arquivo de configuração e um programa de B é utilizado apenas para modificar o conteúdo do arquivo de configuração que a lê. o nome do arquivo de configuração é email.config . é no mesmo diretório no qual o programa a & B reside.

O problema é que eu tenho caminho de um arquivo de anexo usando diálogo de arquivo aberto. Se o caminho aponta para um arquivo no mesmo diretório, o programa funciona perfeito! Mas se ele aponta para um arquivo fora do diretório ele lança uma exceção do tipo System.NullReferenceException .

Aqui está o código

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();
    }
}

O conteúdo do 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>

O que estou fazendo de errado aqui?

EDIT: O valor de configfilename é "email.config"

Foi útil?

Solução

Bem, eu descobri-lo eu mesmo depois de depuração para quase 5 horas, Droga!

O problema foi quando eu usei OpenFileDialog para obter o caminho do arquivo, ele mudou o diretório atual para aquele que é selecionado na caixa de diálogo, para que o programa não conseguiu encontrar o arquivo de configuração. Tudo o que fiz foi para definir a propriedade RestoreDirectory de OpenFileDialog para true e poof funcionou

Obrigado a todos, ChrisF, Eoin Campbell e pablito.

Outras dicas

Você está acessando o arquivo pelo seu caminho completo ou apenas o nome do arquivo?

Se o último, então isso vai funcionar quando o arquivo está na mesma pasta que o executável, mas não o contrário.

Atualizar

Parece que as coisas são mais complicadas do que eu pensava e isso não parece ser o problema aqui - ver os comentários. A linha que está aumentando a exceção é:

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

Então isso significa que há um algum lugar referência nula ao longo da cadeia. Se você pode identificar qual é então que deve dar-lhe um ponteiro para o problema.

O código que você está usando para obter a volta FileName e Caminho do OpenFileDialog.

É um caminho totalmente qualificado para o arquivo?

por exemplo.

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

Por os sons dele, o que está sendo salvas apenas um nome de arquivo, assim que sua aplicação só está olhando no caminho atual.

Eu tive o mesmo problema, eu não sei se isso pode ajudá-lo, mas quando eu mudei o nome do arquivo de configuração, que estava em outra pasta como no seu caso, a .config e não falhar mais , no meu caso eu poderia mudar o nome para que eu não continuar a investigação como fazê-lo trabalhar com outro nome, mas é claro que eu gostaria de saber.

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

de Config não contiver "SSL"

apenas a minha 2c para aqueles que estão tentando este código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top