C#中選中指定文件並讀取類似ini文件的內容


一、背景

由於項目中需要去讀取設備的配置信息,配置文件的內容和INI配置文件的格式類似,所以可以按照INI文件的方式來處理。涉及如何打開一個文件,獲取打開的文件的路徑問題,並讀取選中的文件里邊的內容。

二、參考資料

http://www.cnblogs.com/helloworldtoyou/p/5910556.html
http://www.cnblogs.com/wangsaiming/archive/2011/04/25/2028601.html
http://www.cnblogs.com/zzyyll2/archive/2007/11/06/950584.html

三、如何去打開文件

實現效果如下圖所示,打開選中的文件,通過增加OpenFileDialog控件則可以打開文件。

程序如下,其中FileName為選中的文件的路徑,

private void Openfilebutton_Click(object sender, EventArgs e)
        {
                OpenFileDialog fileEds = new OpenFileDialog();  //定義新的文件打開位置軟件
               
                fileEds.Filter = "EDS文件|*.eds";               //設置文件后綴過濾
                if (fileEds.ShowDialog() == DialogResult.OK)    //如果有選擇打開文件
                {
                    GloableVar.filepath = fileEds.FileName;     //獲取到選中的文件的路徑
                    WzCan_DeviceExploer.ProFile.LoadProfile();  //去加載處理選中的文件的內容
                    textBox1.Text = ProFile.G_BAUDRATE;         //顯示獲取到的文件里邊的內容
                    FiletextBox.Text = fileEds.FileName;        //顯示打開的文件的路徑
                }
            
        }

四、如何去讀取INI文件

首先了解下INI文件的格式如下:

[SECTION 1]
text1=300
text2=0xFF

[SECTION 2]
text3=Hello

程序中使用定義了一個全局變量獲取到選中的文件的路徑GloableVar.filepath,使用WzCan_DeviceExploer.ProFile.LoadProfile()是去加載處理選中的文件的內容,調用該函數使用別人寫好的兩個類來進行讀取,只要增加這兩個類,訪問里邊的成員函數即可對文件的內容進行讀取和寫入。
ProFile.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WzCan_DeviceExploer
{
    class ProFile
    {
        public static void LoadProfile()
        {
            _file = new IniFile(GloableVar.filepath);                           //要讀取文件的位置
            G_BAUDRATE = _file.ReadString("DeviceInfo", "VendorNumber", "");    //讀文件里邊內容
        }

        public static void SaveProfile()
        {
            string strPath = AppDomain.CurrentDomain.BaseDirectory;
            _file = new IniFile(strPath + "Cfg.ini");
            _file.WriteString("CONFIG", "BaudRate", G_BAUDRATE);            //寫數據
        }

        private static IniFile _file;//內置了一個對象

        public static string G_BAUDRATE = "";//給ini文件賦新值
    }
}

EdsFile.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace WzCan_DeviceExploer
{
    public abstract class CustomIniFile
    {
        public CustomIniFile(string AFileName)
        {
            FFileName = AFileName;
        }
        private string FFileName;
        public string FileName
        {
            get { return FFileName; }
        }
        public virtual bool SectionExists(string Section)
        {
            List<string> vStrings = new List<string>();
            ReadSections(vStrings);
            return vStrings.Contains(Section);
        }
        public virtual bool ValueExists(string Section, string Ident)
        {
            List<string> vStrings = new List<string>();
            ReadSection(Section, vStrings);
            return vStrings.Contains(Ident);
        }
        public abstract string ReadString(string Section, string Ident, string Default);
        public abstract bool WriteString(string Section, string Ident, string Value);
        public abstract bool ReadSectionValues(string Section, List<string> Strings);
        public abstract bool ReadSection(string Section, List<string> Strings);
        public abstract bool ReadSections(List<string> Strings);
        public abstract bool EraseSection(string Section);
        public abstract bool DeleteKey(string Section, string Ident);
        public abstract bool UpdateFile();
    }
    /// <summary>
    /// 存儲本地INI文件的類。
    /// </summary>
    public class IniFile : CustomIniFile
    {
        [DllImport("kernel32")]
        private static extern uint GetPrivateProfileString(
            string lpAppName,    // points to section name 
            string lpKeyName,    // points to key name 
            string lpDefault,    // points to default string 
            byte[] lpReturnedString,    // points to destination buffer 
            uint nSize,    // size of destination buffer 
            string lpFileName     // points to initialization filename 
        );

        [DllImport("kernel32")]
        private static extern bool WritePrivateProfileString(
            string lpAppName,    // pointer to section name 
            string lpKeyName,    // pointer to key name 
            string lpString,    // pointer to string to add 
            string lpFileName     // pointer to initialization filename 
        );

        /// <summary>
        /// 構造IniFile實例。
        /// <param name="AFileName">指定文件名</param>
        /// </summary>
        public IniFile(string AFileName)
            : base(AFileName)
        {
        }

        /// <summary>
        /// 析夠IniFile實例。
        /// </summary>
        ~IniFile()
        {
            UpdateFile();
        }

        /// <summary>
        /// 讀取字符串值。
        /// <param name="Ident">指定變量標識。</param>
        /// <param name="Section">指定所在區域。</param>
        /// <param name="Default">指定默認值。</param>
        /// <returns>返回讀取的字符串。如果讀取失敗則返回該值。</returns>
        /// </summary>
        public override string ReadString(string Section, string Ident, string Default)
        {
            byte[] vBuffer = new byte[2048];
            uint vCount = GetPrivateProfileString(Section,
                Ident, Default, vBuffer, (uint)vBuffer.Length, FileName);
            return Encoding.Default.GetString(vBuffer, 0, (int)vCount);
        }
        /// <summary>
        /// 寫入字符串值。
        /// </summary>
        /// <param name="Section">指定所在區域。</param>
        /// <param name="Ident">指定變量標識。</param>
        /// <param name="Value">所要寫入的變量值。</param>
        /// <returns>返回寫入是否成功。</returns>
        public override bool WriteString(string Section, string Ident, string Value)
        {
            return WritePrivateProfileString(Section, Ident, Value, FileName);
        }

        /// <summary>
        /// 獲得區域的完整文本。(變量名=值格式)。
        /// </summary>
        /// <param name="Section">指定區域標識。</param>
        /// <param name="Strings">輸出處理結果。</param>
        /// <returns>返回讀取是否成功。</returns>
        public override bool ReadSectionValues(string Section, List<string> Strings)
        {
            List<string> vIdentList = new List<string>();
            if (!ReadSection(Section, vIdentList)) return false;
            foreach (string vIdent in vIdentList)
                Strings.Add(string.Format("{0}={1}", vIdent, ReadString(Section, vIdent, "")));
            return true;
        }

        /// <summary>
        /// 讀取區域變量名列表。
        /// </summary>
        /// <param name="Section">指定區域名。</param>
        /// <param name="Strings">指定輸出列表。</param>
        /// <returns>返回獲取是否成功。</returns>
        public override bool ReadSection(string Section, List<string> Strings)
        {
            byte[] vBuffer = new byte[16384];
            uint vLength = GetPrivateProfileString(Section, null, null, vBuffer,
                (uint)vBuffer.Length, FileName);
            int j = 0;
            for (int i = 0; i < vLength; i++)
                if (vBuffer[i] == 0)
                {
                    Strings.Add(Encoding.Default.GetString(vBuffer, j, i - j));
                    j = i + 1;
                }
            return true;
        }

        /// <summary>
        /// 讀取區域名列表。
        /// </summary>
        /// <param name="Strings">指定輸出列表。</param>
        /// <returns></returns>
        public override bool ReadSections(List<string> Strings)
        {
            byte[] vBuffer = new byte[16384];
            uint vLength = GetPrivateProfileString(null, null, null, vBuffer,
                (uint)vBuffer.Length, FileName);
            int j = 0;
            for (int i = 0; i < vLength; i++)
                if (vBuffer[i] == 0)
                {
                    Strings.Add(Encoding.Default.GetString(vBuffer, j, i - j));
                    j = i + 1;
                }
            return true;
        }

        /// <summary>
        /// 刪除指定區域。
        /// </summary>
        /// <param name="Section">指定區域名。</param>
        /// <returns>返回刪除是否成功。</returns>
        public override bool EraseSection(string Section)
        {
            return WritePrivateProfileString(Section, null, null, FileName);
        }

        /// <summary>
        /// 刪除指定變量。
        /// </summary>
        /// <param name="Section">變量所在區域。</param>
        /// <param name="Ident">變量標識。</param>
        /// <returns>返回刪除是否成功。</returns>
        public override bool DeleteKey(string Section, string Ident)
        {
            return WritePrivateProfileString(Section, Ident, null, FileName);
        }

        /// <summary>
        /// 更新文件。
        /// </summary>
        /// <returns>返回更新是否成功。</returns>
        public override bool UpdateFile()
        {
            return WritePrivateProfileString(null, null, null, FileName);
        }
    }
}

by 羊羊得億
2017-07-10 ShenZhen


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM