zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    查看SQL语句执行时间、IO开销
    创建性能监视器(logman)
    IIS连接数
    SQL Server重建索引计划
    删除不存在的网卡
    授予普通域用户远程桌面连接DC/客户端权限
    AD新建用户、组、OU
    常用短语
    Android之APP模块编译
    Web&网络协议
  • 原文地址:https://www.cnblogs.com/yangxuli/p/7146729.html
Copyright © 2011-2022 走看看