1 INI文件的格式
C#读写ini文件其实并不是普通的文本文件.它有自己的结构.由若干段落(SECTION)组成,在每个带括号的标题下面,是若干个以单个单词开头的关键字(KEYWORD)和一个等号,等号右边就是关键字的值(VALUE).例如:
- [Section1]
- KeyWord1 = Value1
- KeyWord2 = Value2
- ...
- [Section2]
- KeyWord3 = Value3
- KeyWord4 = Value4
虽然C#中没有,但是在"kernel32.dll"这个文件中有Win32的API函数--WritePrivateProfileString()和GetPrivateProfileString()C#读写ini文件实现之C#声明INI文件的写操作函数WritePrivateProfileString():
- [DllImport( "kernel32" )]
- private static extern long WritePrivateProfileString (
- string section ,string key , string val
- , string filePath ) ;
参数说明:section:INI文件中的段落;key:INI文件中的关键字;val:INI文件中关键字的数值;filePath:INI文件的完整的路径和名称。C#读写ini文件实现之C#申明INI文件的读操作函数GetPrivateProfileString():
- [DllImport("kernel32")]
- private static extern int GetPrivateProfileString (
- string section ,
- string key , string def , StringBuilder retVal ,
- int size , string filePath ) ;
参数说明:section:INI文件中的段落名称;key:INI文件中的关键字;def:无法读取时候时候的缺省数值;retVal:读取数值;size:数值的大小;filePath:INI文件的完整路径和名称。以上是对INI文件的读写操作,然后在使用的地方实现这个类的方法就可以了using System; using System.IO; using System.Runtime.InteropServices; using System.Text; using UnityEngine; internal class IniFiles { public string FileName; public IniFiles() { } public IniFiles(string AFileName) { FileInfo info = new FileInfo(AFileName); if (!info.Exists) { StreamWriter writer = new StreamWriter(AFileName, false, Encoding.Unicode); try { writer.Write("#配置文件"); writer.Close(); } catch { throw new ApplicationException("ini文件不存在"); } } this.FileName = AFileName; } ~IniFiles() { this.UpdateFile(); } [DllImport("kernel32", CharSet = CharSet.Unicode)] private static extern int GetPrivateProfileString(string section, string key, string def, byte[] retVal, int size, string filePath); public float ReadFloat(string Section, string Ident, float Default) { string str = this.ReadString(Section, Ident, Convert.ToString(Default)); try { return Convert.ToSingle(str); } catch (Exception exception) { Debug.LogError(exception.Message); return Default; } } public int ReadInteger(string Section, string Ident, int Default) { string str = this.ReadString(Section, Ident, Convert.ToString(Default)); try { return Convert.ToInt32(str); } catch (Exception exception) { Debug.LogError(exception.Message); return -1; } } public string ReadString(string Section, string Ident, string Default) { byte[] retVal = new byte[0x80]; GetPrivateProfileString(Section, Ident, Default, retVal, retVal.Length, this.FileName); string str = Encoding.Unicode.GetString(retVal); str.Trim(); return str; } public void UpdateFile() { WritePrivateProfileString(null, null, null, this.FileName); } public void WriteFloat(string Section, string Ident, float Value) { this.WriteString(Section, Ident, Value.ToString()); } public void WriteInteger(string Section, string Ident, int Value) { this.WriteString(Section, Ident, Value.ToString()); } [DllImport("kernel32", CharSet = CharSet.Unicode)] private static extern bool WritePrivateProfileString(string section, string key, string val, string filePath); public void WriteString(string Section, string Ident, string Value) { if (!WritePrivateProfileString(Section, Ident, Value, this.FileName)) { throw new ApplicationException("写Ini文件出错"); } } public string IniPath { get { return this.FileName; } set { this.FileName = value; } } public bool IsExit { get { FileInfo info = new FileInfo(this.FileName); return info.Exists; } } }
以下是读取配置文件,然后存入一个Dictionary,直接去Dictionary值就行了using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; using UnityEngine; public class VR_Configuration : MonoBehaviour { private enum WINDOWLOC { LEFTUP, CENTER } private const uint SWP_SHOWWINDOW = 64u; private const int GWL_STYLE = -16; private const int WS_BORDER = 1; [SerializeField] public string productName = "输入PlayerSettings中ProductName的值"; private string wndclass = "UnityWndClass"; [SerializeField] public string configName = "Config.ini"; [SerializeField] public Rect fullScreenVec2; [SerializeField] public Rect windowScreenVec2; private IntPtr windowIndex; private VR_Configuration.WINDOWLOC windowLoc; private IniFiles Ini; // 申明Dictionary 用来保存INI文件的key=value public Dictionary<string, float> CONTROLLERSETVR = new Dictionary<string, float>(3); public Dictionary<string, float> ADDITIONVALUE = new Dictionary<string, float>(5); public Dictionary<string, int> COM = new Dictionary<string, int>(2); private int cxScreen; private int cyScreen; private bool IsFullScreen = true; public bool IsExit { get { return this.Ini.IsExit; } } [DllImport("user32.dll", CharSet = CharSet.Unicode, EntryPoint = "MessageBoxW")] private static extern int MsgBoxW(IntPtr hWnd, string text, string caption, uint type); [DllImport("user32.dll", CharSet = CharSet.Unicode)] private static extern IntPtr SetWindowLong(IntPtr hwnd, int _nIndex, int dwNewLong); [DllImport("user32.dll", CharSet = CharSet.Unicode)] private static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); [DllImport("user32.dll")] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32")] private static extern int GetSystemMetrics(int nIndex); private void Awake() { this.windowIndex = VR_Configuration.FindWindow(this.wndclass, this.productName); string text = Path.GetDirectoryName(Application.dataPath) + Path.AltDirectorySeparatorChar + this.configName; this.cxScreen = VR_Configuration.GetSystemMetrics(0); this.cyScreen = VR_Configuration.GetSystemMetrics(1); if (!File.Exists(text)) { //Ini 写入操作,初始化INI文件 this.Ini = new IniFiles(text); this.Ini.WriteInteger("SETTING", "FullScreen", 1); this.Ini.WriteInteger("SETTING", "FullWidth", this.cxScreen); this.Ini.WriteInteger("SETTING", "FullHeight", this.cyScreen); this.Ini.WriteInteger("SETTING", "WindowLocation", 0); this.Ini.WriteInteger("COM", "Num", 1); this.Ini.WriteFloat("CONTROLLERSETVR", "Center", 123f); this.Ini.WriteFloat("CONTROLLERSETVR", "MoveSpeed", 0.2f); this.Ini.WriteFloat("CONTROLLERSETVR", "RotateSpeed", 3f); this.Ini.WriteFloat("CONTROLLERSETVR", "Dir", 1f); this.Ini.WriteFloat("ADDITIONVALUE", "AddFloat1", 1f); this.Ini.WriteFloat("ADDITIONVALUE", "AddFloat2", 2f); this.Ini.WriteFloat("ADDITIONVALUE", "AddFloat3", 3f); this.Ini.WriteFloat("ADDITIONVALUE", "AddFloat4", 4f); this.Ini.WriteFloat("ADDITIONVALUE", "AddFloat5", 5f); } else { this.Ini = new IniFiles(); this.Ini.IniPath = text; } // 初始化Dictionary,读取 this.fullScreenVec2.width=((float)this.Ini.ReadInteger("SETTING", "FullWidth", 0)); this.fullScreenVec2.height=((float)this.Ini.ReadInteger("SETTING", "FullHeight", 0)); this.COM.Add("Num", this.Ini.ReadInteger("COM", "Num", 1)); this.CONTROLLERSETVR.Add("Center", this.Ini.ReadFloat("CONTROLLERSETVR", "Center", 100f)); this.CONTROLLERSETVR.Add("MoveSpeed", this.Ini.ReadFloat("CONTROLLERSETVR", "MoveSpeed", 1f)); this.CONTROLLERSETVR.Add("RotateSpeed", this.Ini.ReadFloat("CONTROLLERSETVR", "RotateSpeed", 1f)); this.CONTROLLERSETVR.Add("Dir", this.Ini.ReadFloat("CONTROLLERSETVR", "Dir", 1f)); this.ADDITIONVALUE.Add("AddFloat1", this.Ini.ReadFloat("ADDITIONVALUE", "AddFloat1", 0f)); this.ADDITIONVALUE.Add("AddFloat2", this.Ini.ReadFloat("ADDITIONVALUE", "AddFloat2", 0f)); this.ADDITIONVALUE.Add("AddFloat3", this.Ini.ReadFloat("ADDITIONVALUE", "AddFloat3", 0f)); this.ADDITIONVALUE.Add("AddFloat4", this.Ini.ReadFloat("ADDITIONVALUE", "AddFloat4", 0f)); this.ADDITIONVALUE.Add("AddFloat5", this.Ini.ReadFloat("ADDITIONVALUE", "AddFloat5", 0f)); } private void Start() { // 设置屏幕分辨率 if (this.Ini.ReadInteger("SETTING", "FullScreen", 0) == -1) { VR_Configuration.MsgBoxW(this.windowIndex, "请检查是否写入屏幕参数或者写入的是正整数!\n写入格式:FullWidth = 1024 FullHeight = 768", "读取假全屏参数错误", 16u); Application.Quit(); } if (this.Ini.ReadInteger("SETTING", "FullScreen", -1) == 1) { Screen.SetResolution((int)this.fullScreenVec2.width, (int)this.fullScreenVec2.width, false); this.IsFullScreen = true; } if (this.Ini.ReadInteger("SETTING", "FullScreen", 0) == 0) { Screen.SetResolution((int)this.windowScreenVec2.width, (int)this.windowScreenVec2.height, false); } this.windowLoc = (VR_Configuration.WINDOWLOC)this.Ini.ReadInteger("SETTING", "WindowLocation", 0); switch (this.windowLoc) { case VR_Configuration.WINDOWLOC.LEFTUP: this.fullScreenVec2.x=0f; this.fullScreenVec2.y=0f; this.windowScreenVec2.x=0f; this.windowScreenVec2.y=0f; return; case VR_Configuration.WINDOWLOC.CENTER: this.fullScreenVec2.center=new Vector2((float)this.cxScreen * 0.5f, (float)this.cyScreen * 0.5f); this.windowScreenVec2.center=this.fullScreenVec2.center; return; default: return; } } private void Update() { if (this.IsFullScreen) { VR_Configuration.SetWindowLong(this.windowIndex, -16, 1); VR_Configuration.SetWindowPos(this.windowIndex, -1, (int)this.fullScreenVec2.x, (int)this.fullScreenVec2.y, (int)this.fullScreenVec2.width, (int)this.fullScreenVec2.height, 64u); } if (Input.GetKeyDown(KeyCode.Space)) { Application.Quit(); } } }
然后使用的地方直接获取:GameObject.Find("GameObject").GetComponent<VR_Configuration>().COM["Num"];开始的时候我们把脚本绑定到物体上
运行后会Ini配置文件
至此读取配置INI就overPath.AltDirectorySeparatorChar 如果用‘’