日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c# 保存软件配置

發布時間:2023/12/20 C# 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c# 保存软件配置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

保存配置的方法

A. 文本直接保存
B. 序列化與反序列化
C. XML

引入命名空間:

using System.IO;

一、文本直接保存

通過類【iniHelper】對數據進行直接保存,文件名:Config.ini 保存結果如下

[PLC參數] IP=192.168.2.4 Port=19622
1.1 引入命名空間
using System.IO;
1.2 新增IniConfigHelper 類
using System; using System.Text; using System.IO; using System.Runtime.InteropServices; using System.Collections.Generic;namespace Helper {public class IniConfigHelper{public static string filePath = "";#region API函數聲明[DllImport("kernel32")]private static extern long WritePrivateProfileString(string section, string key,string val, string filePath);//需要調用GetPrivateProfileString的重載[DllImport("kernel32", EntryPoint = "GetPrivateProfileString")]private static extern long GetPrivateProfileString(string section, string key,string def, StringBuilder retVal, int size, string filePath);[DllImport("kernel32", EntryPoint = "GetPrivateProfileString")]private static extern uint GetPrivateProfileStringA(string section, string key,string def, Byte[] retVal, int size, string filePath);#endregion#region 獲取所有的Sections/// <summary>/// 獲取所有的Sections/// </summary>/// <param name="iniFilename">文件路徑</param>/// <returns>Sections集合</returns>public static List<string> ReadSections(string iniFilename){List<string> result = new List<string>();Byte[] buf = new Byte[65536];uint len = GetPrivateProfileStringA(null, null, null, buf, buf.Length, iniFilename);int j = 0;for (int i = 0; i < len; i++)if (buf[i] == 0){result.Add(Encoding.Default.GetString(buf, j, i - j));j = i + 1;}return result;}#endregion#region 獲取指定Section下的所有Keys/// <summary>/// 獲取指定Section下的所有Keys/// </summary>/// <param name="SectionName">SectionName</param>/// <param name="iniFilename">文件路徑</param>/// <returns>Keys集合</returns>public static List<string> ReadKeys(string SectionName, string iniFilename){List<string> result = new List<string>();Byte[] buf = new Byte[65536];uint len = GetPrivateProfileStringA(SectionName, null, null, buf, buf.Length, iniFilename);int j = 0;for (int i = 0; i < len; i++)if (buf[i] == 0){result.Add(Encoding.Default.GetString(buf, j, i - j));j = i + 1;}return result;}#endregion#region 讀Ini文件public static string ReadIniData(string Section, string Key, string NoText){return ReadIniData(Section, Key, NoText, filePath);}public static string ReadIniData(string Section, string Key, string NoText, string iniFilePath){if (File.Exists(iniFilePath)){StringBuilder temp = new StringBuilder(1024);GetPrivateProfileString(Section, Key, NoText, temp, 1024, iniFilePath);return temp.ToString();}else return string.Empty;}#endregion#region 寫Ini文件public static bool WriteIniData(string Section, string Key, string Value){return WriteIniData(Section, Key, Value, filePath);}public static bool WriteIniData(string Section, string Key, string Value, string iniFilePath){long OpStation = WritePrivateProfileString(Section, Key, Value, iniFilePath);if (OpStation == 0)return false;else return true;}#endregion} }
1.3 測試新建數據
private void button1_Click(object sender, EventArgs e) {Helper.IniConfigHelper.WriteIniData("PLC參數", "IP", "192.168.2.4", Application.StartupPath + "\\Settings.ini"); }
1.4 關閉窗口時保存數據
private void Form1_FormClosing(object sender, FormClosingEventArgs e) {// 如果文件不存在則創建文件后再保存if (!File.Exists(configPath)){FileStream fileStream = new FileStream(configPath, FileMode.Create);fileStream.Close();}IniConfigHelper.WriteIniData("PLC參數", "IP", this.textBoxIPAddress.Text.Trim(), configPath);IniConfigHelper.WriteIniData("PLC參數", "Port", this.textBoxPort.Text.Trim(), configPath); }
1.5 窗口加載時讀取數據
private void Form1_Load(object sender, EventArgs e) {// 如果文件存在,則讀取相應的參數信息if (File.Exists(configPath)){this.textBoxIPAddress.Text = IniConfigHelper.ReadIniData("PLC參數", "IP", "", configPath);this.textBoxPort.Text = IniConfigHelper.ReadIniData("PLC參數", "Port", "", configPath);} }

二、序列化與反序列化

  • 更方便讀取和寫入大量配置信息
  • 數據更安全
1.1 引入命名空間
using System.IO; using System.Runtime.Serialization.Formatters.Binary;
1.2 新增Student 類
using System; using System.Collections.Generic; using System.Text;namespace #此處修改為項目名稱 {[Serializable] // 對象可序列化標記,必須class Student{public string Name { get; set; }public string Gender { get; set; }public int Age { get; set; }public DateTime Birthday { get; set; }} }
1.3 保存配置
private void btnSerialize_Click(object sender, EventArgs e) {//封裝對象信息Student objStu = new Student(){Name = this.txtName.Text.Trim(),Age = Convert.ToInt16(this.txtAge.Text.Trim()),Gender = this.txtGender.Text.Trim(),Birthday = Convert.ToDateTime(this.txtBirthday.Text.Trim())};//【1】創建文件流FileStream fs = new FileStream("C:\\objStu.obj", FileMode.Create);//【2】創建二進制格式化器BinaryFormatter formatter = new BinaryFormatter();//【3】調用序列化方法formatter.Serialize(fs, objStu);//【4】關閉文件流fs.Close(); }
1.3 打開配置
private void btnDeserialize_Click(object sender, EventArgs e) {//【1】創建文件流FileStream fs = new FileStream("C:\\objStu.obj", FileMode.Open);//【2】創建二進制格式化器BinaryFormatter formatter = new BinaryFormatter();//【3】調用序列化方法Student objStu = (Student)formatter.Deserialize(fs);//【4】關閉文件流fs.Close();//顯示對象屬性this.txtName.Text = objStu.Name;this.txtAge.Text = objStu.Age.ToString();this.txtGender.Text = objStu.Gender;this.txtBirthday.Text = objStu.Birthday.ToShortDateString(); }

三、XML

1.1 引入命名空間
using System.Xml;
1.2 XML示范文件
<Students><Student><StuName>王永利</StuName><StuAge>19</StuAge><Gender></Gender><ClassName>計算機1</ClassName></Student><Student><StuName>王大拿</StuName><StuAge>22</StuAge><Gender></Gender><ClassName>計算機2</ClassName></Student><DataInfo><Version vNo="1.2" pTime="2012-12-12">數據版本信息</Version></DataInfo> </Students>
1.3 寫入XML文件(待補充)
1.4 讀取XML文件
private void btnLoadXML_Click(object sender, EventArgs e) {XmlDocument objDoc = new XmlDocument(); //【1】創建XML文檔操作對象objDoc.Load("StuScore.xml"); //【2】加載XML文件到文檔對象中XmlNode rootNode = objDoc.DocumentElement; //【3】獲取XML文檔根目錄List<Student> list = new List<Student>();//創建對象集合 foreach (XmlNode stuNode in rootNode.ChildNodes) //【4】遍歷根節點(根節點包含所有節點){if (stuNode.Name == "Student"){Student objStu = new Student();foreach (XmlNode subNode in stuNode) //【5】遍歷子節點{switch (subNode.Name)//根據子節點的名稱封裝到對象的屬性{case "StuName":objStu.StuName = subNode.InnerText;//獲取《節點名稱》對應的《節點值》break;case "StuAge":objStu.StuAge = Convert.ToInt16(subNode.InnerText);break;case "Gender":objStu.Gender = subNode.InnerText;break;case "ClassName":objStu.ClassName = subNode.InnerText;break;}}list.Add(objStu);}}this.dgvStuList.DataSource = list; }
1.5 查找方法
private void btnShowVersion_Click(object sender, EventArgs e) {//創建XML讀取器XmlTextReader tReader = new XmlTextReader("StuScore.xml");string info = string.Empty;//循環查詢while (tReader.Read()){if (tReader.Name == "Version"){info = "版本:" + tReader.GetAttribute("vNo") + " 發布時間:" + tReader.GetAttribute("pTime");break;}}MessageBox.Show(info,"數據版本"); }

寫在最后

本博文只是我在學習c#的過程中所做的筆記,方便以后查閱實現過程。資料均來自網上,如果有侵權請聯系我刪除,謝謝。

總結

以上是生活随笔為你收集整理的c# 保存软件配置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。