从 C# 应用程序中的配置文件中检索值不起作用

kyo*_*oko 5 c# config

我遇到了一个问题,当我尝试使用配置文件时,我在这里和其他地方阅读了一些帖子,但我无法解决工作中的问题,

在我的问题中,我添加了配置。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="CA.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <userSettings>
        <CA.Properties.Settings>
 
          <appSettings>
            <add key="ab123" value="D:\ab123\Source\ab123.c" />
          </appSettings>

        </CA.Properties.Settings>
    </userSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

文件中声明

string ab123 = ConfigurationManager.AppSettings["ab123"];
Run Code Online (Sandbox Code Playgroud)

但是在侧面,我显示的错误是“win32 Exception was unhandled - System can not find the file specified”

System.Diagnostics.Process.Start(ConfigurationManager.AppSettings["ab123"]);
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,ab123值始终为空!我确定路径是正常的。

我该如何解决?

Mic*_*tch 4

从您的 xml 配置文件看来,您实际上是在尝试使用用户设置而不是应用程序设置,并且您混合了一些想法。我认为更正确的配置版本可能是:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="CA.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <userSettings>
      <CA.Properties.Settings>
        <setting name="ab123" serializeAs="String">
          <value>D:\ab123\Source\ab123.c</value>
        </setting>
        </CA.Properties.Settings>
    </userSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

唯一显着的区别是定义设置的方式。例如我将其更改为:

<setting name="ab123" serializeAs="String">
    <value>D:\ab123\Source\ab123.c</value>
</setting>
Run Code Online (Sandbox Code Playgroud)

您可以使用不同的方法创建更多设置,就像这样name

客户端代码有点不同,因为它必须找到 userSettings,找到程序属性设置,然后查询密钥(如ab123)。我添加了一些简单的错误处理,但您需要自己处理错误。我只是返回错误以简化代码。该代码具有内联注释,可帮助弄清楚发生了什么。

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Diagnostics;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            // Retrieve the userSettings gorup
            ConfigurationSectionGroup group = config.SectionGroups[@"userSettings"];
            if (group == null) return;

            // Get the program settings
            ClientSettingsSection clientSection = group.Sections["CA.Properties.Settings"] as ClientSettingsSection;
            if (clientSection == null) return;

            // This retrieves the value associated with the key
            string sFileName = clientSection.Settings.Get("ab123").Value.ValueXml.InnerText;

            // Check if ab123 has a value and the file exists
            if (!string.IsNullOrEmpty(sFileName) && System.IO.File.Exists(sFileName))
            {
                using (StreamReader sr = new StreamReader(sFileName))
                {
                    string line;
                    // Read and display lines from the file until the end of  
                    // the file is reached. 
                    while ((line = sr.ReadLine()) != null)
                    {
                        System.Diagnostics.Debug.WriteLine(line);
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用 Settings.settings 来创建和删除设置,那么代码可以简化为这样,因为 Visual Studio 将为您的设置对象创建在设计时和运行时访问的绑定。有关通过 Visual Studio IDE 使用 Settings.settings 的信息,请参阅本文。如果由于某种原因下面的代码不起作用,您可以使用上面的代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Diagnostics;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string sFileName = Properties.Settings.Default.ab123;

            // Check if ab123 has a value and the file exists
            if (!string.IsNullOrEmpty(sFileName) && System.IO.File.Exists(sFileName))
            {
                using (StreamReader sr = new StreamReader(sFileName))
                {
                    string line;
                    // Read and display lines from the file until the end of  
                    // the file is reached. 
                    while ((line = sr.ReadLine()) != null)
                    {
                        System.Diagnostics.Debug.WriteLine(line);
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)