C#文件操作——配置文件

这篇具有很好参考价值的文章主要介绍了C#文件操作——配置文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

配置文件一般分为内置配置文和用户自定义配置文件。

内置配置文件包括app.config、web.config、Settings.settings等等。

用户自定义配置文件一般是将配置信息放到INI文件、XML文件或注册表中,配置信息一般包括程序设置,记录运行信息,保存控件的信息(比如位置,样式)。
 

一、内置配置文件操作

app.config和web.config操作类似,以app.config为例,Settings.settings能够指定值的类型和范围。

1.app.config文件操作

该配置文件中主要的节点有:connectionStrings、appSettings、configSections等,这几个属于常用,操作都略有不同,DotNet提供直接操作各个节点的方法。在用到ConfigurationManager时要添加system.configuration.dll程序集的引用。

程序移植后配置文件的修改会保存在.exe.config的文件中,但是根据我经验如果你不修改配置文件,一般exe不自动创建一个.exe.config的文件。

在项目进行编译后,在bin\Debuge文件下,将出现两个配置文件,一个名为“*.EXE.config”,另一个名为“*.vshost.exe.config”。第一个文件为项目实际使用的配置文件,在程序运行中所做的更改都将被保存于此;第二个文件为原代码“app.config”的同步文件,在程序运行中不会发生更改。

connectionStrings:由于保存数据连接字符串

读取:

ConfigurationManager.ConnectionStrings["AccessDB"].ConnectionString;

写入:

//设置连接字符串
 
ConnectionStringSettings setConnStr = newConnectionStringSettings("AccessDB", connectionString,"System.Data.OleDb");
 
//打开当前应用程序的app.config文件,进行操作
 
Configuration appConfig =ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
 
//由于没有更新连接字符串的方法,所以这里直接再添加一个连接字符串
 
appConfig.ConnectionStrings.ConnectionStrings.Add(setConnStr);
 
appConfig.Save();
 
// 强制重新载入配置文件的ConnectionStrings配置节
 
ConfigurationManager.RefreshSection("connectionStrings");

appSettings:主要存储程序设置,以键值对的形式出现

读取

String str = ConfigurationManager.AppSettings["DemoKey"];

写入

Configuration cfg=ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
 
cfg.AppSettings.Settings["DemoKey"].Value= "DemoValue";
 
cfg.Save();

configSections:自定义配置节

name:自定义配置节的名称。

type:自定义配置节的类型,主要包括:

System.Configuration.SingleTagSectionHandler

System.Configuration.DictionarySectionHandler

System.Configuration.NameValueSectionHandler。

不同的type不但设置配置节的方式不一样,最后访问配置文件的操作上也有差异。

三个不同的type操作:
 

<?xmlversion="1.0" encoding="utf-8" ?>
 
<configuration>
 
     <configSections>
 
         <sectiontype="System.Configuration.SingleTagSectionHandler"/>
 
         <sectiontype="System.Configuration.DictionarySectionHandler"/>
 
         <sectiontype="System.Configuration.NameValueSectionHandler" />
 
     </configSections>
 
     <Test1 setting1="Hello"setting2="World"/>
 
     <Test2>
 
         <add key="Hello"value="World" />
 
     </Test2>
 
     <Test3>
 
         <add key="Hello"value="World" />
 
     </Test3>   
 
</configuration>

说明:在声明部分使用<sectiontype="System.Configuration.SingleTagSectionHandler"/>声明了一个配置节它的名字叫Test1,类型为SingleTagSectionHandler。在设置配置节部分使用 <Test1 setting1="Hello"setting2="World"/>设置了一个配置节,它的第一个设置的值是Hello,第二个值是World,当然还可以有更多。其它的两个配置节和这个类似。 

下面我们看在程序中如何访问这些自定义的配置节。我们用过ConfigurationSettings类的静态方法GetConfig来获取自定义配置节的信息。
 

//访问配置节Test1
 
IDictionary IDTest1 =(IDictionary)ConfigurationSettings.GetConfig("Test1");
 
string str = (string)IDTest1["setting1"]+" "+(string)IDTest1["setting2"];
 
MessageBox.Show(str);        //输出Hello World
 
//访问配置节Test1的方法2
 
string[] values1=new string[IDTest1.Count];
 
IDTest1.Values.CopyTo(values1,0);
 
MessageBox.Show(values1[0]+""+values1[1]);     //输出HelloWorld
 
//访问配置节Test2
 
IDictionary IDTest2 =(IDictionary)ConfigurationSettings.GetConfig("Test2");
 
string[] keys=new string[IDTest2.Keys.Count];
 
string[] values=new string[IDTest2.Keys.Count];
 
IDTest2.Keys.CopyTo(keys,0);
 
IDTest2.Values.CopyTo(values,0);
 
MessageBox.Show(keys[0]+" "+values[0]);
 
//访问配置节Test3
 
NameValueCollectionnc=(NameValueCollection)ConfigurationSettings.GetConfig("Test3");
 
MessageBox.Show(nc.AllKeys[0].ToString()+""+nc["Hello"]); //输出HelloWorld

配置节处理程序

返回类型

SingleTagSectionHandler

Systems.Collections.IDictionary

DictionarySectionHandler

Systems.Collections.IDictionary

NameValueSectionHandler

Systems.Collections.Specialized.NameValueCollection


sectionGroup:自定义配置节组

配置节组是使用<sectionGroup>元素,将类似的配置节分到同一个组中。配置节组声明部分将创建配置节的

包含元素,在<configSections>元素中声明配置节组,并将属于该组的节置于<sectionGroup>元素中。下面

是一个包含配置节组的配置文件的例子:

<?xml version="1.0"encoding="utf-8" ?>
 
<configuration>

     <configSections>
        <sectionGroup >
            <section type="System.Configuration.NameValueSectionHandler"/>
        </sectionGroup>
     </configSections>

     <TestGroup>
        <Test>
            <add key="Hello" value="World"/>
        </Test>
     </TestGroup>

</configuration>

下面是访问这个配置节组的代码:

NameValueCollectionnc=NameValueCollection)ConfigurationSettings.GetConfig("TestGroup/Test");
MessageBox.Show(nc.AllKeys[0].ToString()+""+nc["Hello"]);    //输出HelloWorld

2.Settings.settings配置文件操作

这个用的不多,操作也很简单,在此不详细叙述。

二、用户自定义文件操作

1.INI配置文件操作

2.XML配置文件操作

XML配置文件一般由我们自己定义格式,由于某些地方对于app.config不提供写的功能,我们就需要自己来操作这个XML,这里我们就拿它作为例子,来说明XML的操作。

privatevoid SaveConfig(string ConnenctionString)
         {
             XmlDocument doc=new XmlDocument();
             //获得配置文件的全路径
             stringstrFileName=AppDomain.CurrentDomain.BaseDirectory.ToString()+"Code.exe.config";
             doc.LOAd(strFileName);
             //找出名称为“add”的所有元素
            XmlNodeList nodes=doc.GetElementsByTagName("add");
             for(int i=0;i<nodes.Count;i++)
             {
                 //获得将当前元素的key属性
                 XmlAttributeatt=nodes[i].Attributes["key"];
                 //根据元素的第一个属性来判断当前的元素是不是目标元素
                 if (att.Value=="ConnectionString")
                 {
                     //对目标元素中的第二个属性赋值
                    att=nodes[i].Attributes["value"];
                    att.Value=ConnenctionString;
                     break;
                 }
             }
             //保存上面的修改
            doc.Save(strFileName);
         }

3.注册表配置操作

首先注册表也是以键值对的形式存储的,DotNet提供对注册表的操作。

操作实例:

        /// <summary>
        /// 从注册表中加载窗体位置大小等信息
        /// </summary>
        public static voidLoadFormPosition(System.Windows.Forms.Form Fo)
        {
            Microsoft.Win32.RegistryKey rk =Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\\\MapWinGISConfig",false);
            try
            {
                if ((rk.GetValue(Fo.Name +"_x").ToString() != "") && (rk.GetValue(Fo.Name +"_y").ToString()!= "") && (rk.GetValue(Fo.Name + "_w").ToString()!= "") && (rk.GetValue(Fo.Name+ "_h").ToString() != ""))
                {
                    Fo.Location = newSystem.Drawing.Point(int.Parse(rk.GetValue(Fo.Name +"_x").ToString(),CultureInfo.InvariantCulture), int.Parse(rk.GetValue(Fo.Name +"_y").ToString(),CultureInfo.InvariantCulture));
 
                    Fo.Size = newSystem.Drawing.Size(int.Parse(rk.GetValue(Fo.Name +"_w").ToString(),CultureInfo.InvariantCulture), int.Parse(rk.GetValue(Fo.Name +"_h").ToString(),CultureInfo.InvariantCulture));
                }
            }
            catch
            {
            }
            finally
            {
                rk.Close();
            }
        }

        /// <summary>
        /// 将窗体位置大小信息保存在注册表中
        /// </summary>
        public static voidSaveFormPosition(System.Windows.Forms.Form Fo)
        {
            Microsoft.Win32.RegistryKey rk =Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Software\\\\MapWinGISConfig");
 
            if (Fo.Visible &&Fo.WindowState != System.Windows.Forms.FormWindowState.Minimized&&Fo.Location.X > -1 && Fo.Location.Y > -1 && Fo.Size.Width> 1 && Fo.Size.Height > 1)
            {
                rk.SetValue(Fo.Name +"_x", Fo.Location.X);
                rk.SetValue(Fo.Name +"_y", Fo.Location.Y);
                rk.SetValue(Fo.Name +"_w", Fo.Size.Width);
                rk.SetValue(Fo.Name +"_h", Fo.Size.Height);
            }
            rk.Close();
        }

三、应用程序信息配置

通过代码继承ApplicationSettingsBase类(C/S模式),在代码中设置相关的属性。

   1.继承该类一般有类属性[SettingsProvider("System.Configuration.LocalFileSettingsProvider")]-详情如下

   2.每个属性必须设置是[ApplicationScopedSetting()]还是[UserSocpedSetting()],还可以设置默认值[DefaultSettingValueAttribute("100,100")]

   3.属性设置完成后,在方法级别或方法内部(视情况而定)实例化该继承的类,在窗体加载时设置相应属性。加载程序配置方法有两种-详情如下。

   4.如果需要可以利用事件监视设置的属性改变、保存、加载时进行哪些操作

   5.在窗体注销时保存设置。

详解:

 (一),LocalFileSettingsProvider---为应用程序设置类提供持久性存储。

     1.该类提供一种机制--程序使用配置数据的机制,其将程序的设置文件保存到默认的位置。

     2.客户端并不显示访问这个类,而是在需要服务时由设置机制自动调用,如:ApplicationSettingsBase中的很多成员都使用该类。

     3.该类将配置文件保存为.config的XML文件

         1.若字段的属性设置为[UserScopedSetting()],则保存为user.config文件,

           保存位置C:\Documentsand Settings\[计算机用户名]\LocalSettings\Application Data\[AssemblyCompany("huzongzhe")程序集中的一个属性]\

         2.若字段的属性设置为[ApplicationScopedSetting()],则保存为[程序名].exe.config文件,

           保存位置:与可执行文件相同的目录中。

    4.ToolStripManager.LoadSettings(this)和ToolStripManager.SaveSettings(this)方法解释

       首先,ToolStripManager提供Toolstrip相关类型的一些操作,包括合并,拆分toolstrip、呈现样式、保存加载设置。

       其次,LoadSettings、SaveSettings的位置是C:\Documentsand Settings\[计算机用户名]\LocalSettings\Application Data\[AssemblyCompany("huzongzhe")程序集中的一个属性]\

             与LocalFileSettingsProvider提供的文件配置是同一个位置,并且是同一个文件。  

      最后,LoadSettings的内容:Size、IsDefault、ItemOrder、Visible、ToolStripPanelName、Name、Location等7个属性。

 (二),加载程序配置方法

     1.通过函数Binding来绑定,这样在程序加载时直接与配置文件的数据绑定,并且可以在值改变时直接加载到XML中。

           Binding bndBackColor = new Binding("BackColor", frmSettings1,

               "FormBackColor", true,DataSourceUpdateMode.OnPropertyChanged);

           this.DataBindings.Add(bndBackColor);

     2.通过提取的方法。这样每次修改后不能动态改变,需要手动设置。

      this.Size = frmSettings1.FormSize;

 (三),[SettingsGroupName("System.Windows.Forms.ToolStripSettings.MapWinGIS.MainProgram.MapWinForm")]类属性

     设置每个Toolstrip的前缀名,即每个组的前面限定名

     例如:tlbZoom工具条在配置文件中的标识-->System.Windows.Forms.ToolStripSettings.MapWinGIS.MainProgram.MapWinForm.tlbZoom

 (四),方法Reload();Reset();Save(); Upgrade();

       Reload()方法从配置文件重新加载值。

      Reset() 方法将设置重置为默认值。

       Save() 方法保存当前设置的值。

      Upgrade()更新程序设置值。

代码示例:文章来源地址https://www.toymoban.com/news/detail-767102.html

 [SettingsProvider("System.Configuration.LocalFileSettingsProvider")]
 [SettingsGroupName("System.Windows.Forms.ToolStripSettings.MapWinGIS.MainProgram.MapWinForm")]
    sealedclass ToolStripSettings : ApplicationSettingsBase
    {
       public ToolStripSettings(string settingsKey) : base(settingsKey)//传过来的是toolstrip的Name属性
        {
        }
 
       [UserScopedSetting()]
       public System.Drawing.Point Location
        {
           get
            {
               if (this["Location"] == null)
                {
                   if (this.GetPreviousVersion("Location") == null)
                   {
                        return newSystem.Drawing.Point(-1, -1);
                   }
                   return ((System.Drawing.Point)(this.GetPreviousVersion("Location")));
               }
               return ((System.Drawing.Point)(this["Location"]));
            }
 
          set
            {
               this["Location"] = value;
            }
        }
 
       [UserScopedSetting(), DefaultSettingValue("StripDocker.Top")]
       public string ToolStripPanelName
        {
           get
            {
               if(string.IsNullOrEmpty((string)(this["ToolStripPanelName"])))
               {
                   // 设置早期设置的值
                    if(string.IsNullOrEmpty((string)(this.GetPreviousVersion("ToolStripPanelName"))))
                   {
                       // 默认值
                       return string.Empty;
                   }
                   return ((string)(this.GetPreviousVersion("ToolStripPanelName")));
               }
               return ((string)(this["ToolStripPanelName"]));
            }
          set
            {
               this["ToolStripPanelName"] = value;
            }
        }
 
       [UserScopedSetting()]
       [DefaultSettingValue("ImageAndText")]
       public string DisplayStyle
        {
           get
            {
               const string defaultValue = "ImageAndText";
               if (this["DisplayStyle"] == null ||((string)(this["DisplayStyle"])) ==string.Empty)
             {
                   // 设置早期值
                   if (this.GetPreviousVersion("DisplayStyle") == null ||((string)(this.GetPreviousVersion("DisplayStyle")))== string.Empty)
                    {
                        // 默认值
                        return defaultValue;
                   }
                   return ((string)(this.GetPreviousVersion("DisplayStyle")));
               }
               return ((string)(this["DisplayStyle"]));
            }
           set
            {
               this["DisplayStyle"] = value;
            }
        }
    }

到了这里,关于C#文件操作——配置文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#文件操作从入门到精通(1)——INI文件操作

    我们在开发c#的winform程序中,因为有些参数是不断变化的 ,所以经常需要开放一些参数提供给用户设置,通过操作Ini文件来保存我们设置的参数也是c#开发中经常使用的技术,本文就来详细介绍操作ini文件的以下功能: 1、读取ini文件,获取某个节点的某个键的值 2、写入in

    2024年02月14日
    浏览(60)
  • c# 操作剪切板,复制文本或文件

     1.将文本内容放入剪切板          Clipboard.SetDataObject(\\\"要复制的内容\\\");//复制内容到粘贴板 2.将文本内容从剪切板取出               IDataObject iData = Clipboard.GetDataObject();           if (iData.GetDataPresent(DataFormats.Text))            {            label1.Text = (String)iData.GetData(D

    2023年04月08日
    浏览(40)
  • C#操作Excel文件三种方式

    C#操作Excel文件三种方式 彭世瑜2021-07-12 16:14:28 文章标签C/C++文章分类C/C++后端开发阅读数5317 .Net平台上对Excel进行操作主要有两种方式。第一种,把Excel文件看成一个数据库,通过OleDb的方式进行读取与操作;第二种,调用Excel的COM组件。两种方式各有特点。 注意一些简单的问

    2024年02月15日
    浏览(40)
  • c# 代码操作ftp服务器文件

    好久不见,我又回来了。给大家分享一个最近c#代码操作ftp服务器的代码示例   基础类的构造函数和属性       FtpOperation 中其他的方法 调用示例  贴了半天代码,都不太行,一会能展开,一会展不开,源码地址放下面了。 项目地址:https://github.com/yycb1994/FtpSiteManager

    2024年02月21日
    浏览(45)
  • C#操作Excel文件三种方式详解

    1.OleDb方式: 使用.NET Framework内置的System.Data.OleDb命名空间中的类,可以将Excel文件当作数据库来读取数据。这种方式适用于较旧版本的Excel文件(.xls格式,即Excel 2003及更早版本)。 2.COM组件方式: 利用Office Interop库(如Microsoft.Office.Interop.Excel),可以直接调用Excel应用程序的

    2024年03月18日
    浏览(59)
  • C# 文件操作(复制、移动、重命名、创建、打开、删除)

    目录 一、简介 二、创建文件 三、写入文件 四、读取文件 五、复制文件 六、移动文件 七、重命名文件 八、删除文件 结束 C#中的IO(Input/Output)操作包括读取和写入文件、读取和写入流、以及操作目录和文件夹等。这些操作都可以通过System.IO命名空间中的类实现。下面对C

    2024年02月01日
    浏览(49)
  • C#配置文件多语言切换

    以下是一个简单的解决方案,包括代码和注释。这个方案使用了资源文件和配置文件来实现多语言切换,同时将代码封装成了一个类,方便调用。 首先,我们需要创建三个资源文件,分别为: - Resources.resx:中文资源文件 - Resources.en.resx:英文资源文件 - Resources.vi.resx:越南语

    2024年02月09日
    浏览(42)
  • C#(四十六)之基于流的文件操作(FileStream)

    FileStream类属性和方法 属性 CanRead 指示当前文件流是否支持读取 CanWrite 指示当前文件流是否支持写入 CanSeek 指示当前文件流是否支持查找 IsAsync FileStream是同步打开还是异步打开 Length 流的长度(字节数) CanTimeOut 当前文件流是否可以超时 ReadTimeOut 最大读取时间,超过则超时

    2024年02月12日
    浏览(34)
  • Unity C# 使用IO流对文件的常用操作

    IO流是C#语言中对文件操作常用的方式,但在Unity跨平台开发中需要注意有些平台不支持IO,有些平台的只读文件不支持支持操作,例如安卓平台的读取StreamingAsset文件夹等。 大部分项目中都会有大量的对文件操作需求,因此我使用IO流整理编写了一些常用的对文件操作方法,需

    2024年02月09日
    浏览(35)
  • C#文件读取的全局配置编程方法

    C#怎样在类库或者应用入口从配置文件读取参数,并作用到全局。 面向对象的程序有很多类库分布在很多cs文件,如何全局起作用。 如何从可读可编辑的文本导入配置。 静态类保存全局变量。 json文件保存,可读。Newtonsoft.json 软件导入方便。 关于newtonsoft开源许可:\\\"Json.NET

    2024年02月14日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包