C # arquivos de configuração
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"
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.