• 使用Marshal.Copy把Txt行数据转为Struct类型值


    添加重要的命名空间:

    using System.Runtime.InteropServices;

    先建立结构相同(char长度相同)的Struct类型用于转换:

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct Employee
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public char[] EmployeeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)]
            public char[] LastName;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)]
            public char[] FirstName;
            //这里省略很多列
         }

    数据文本类似下面, 如这三列固定长度(6,30,30):

    10001 Nick                          Yang                          
    10002 Nick2                         Yang                          
    10003 Nick3                         Yang                          

    代码获取并转换:

            /// <summary>
            /// Get data from interface file
            /// </summary>
            public void GetDataFromFile()
            {
                try
                {
                    string path = ConfigurationManager.ConnectionStrings["DataPath"].ConnectionString;
                    if (File.Exists(path))
                    {
                        string[] rows = File.ReadAllLines(path, Encoding.UTF8);
                        foreach (string row in rows)
                        {
                            byte[] bytes = Encoding.UTF8.GetBytes(row);
                            //以下为重点代码
                            int size = Marshal.SizeOf(typeof(Employee));
                            IntPtr buffer = Marshal.AllocHGlobal(size);
                            try
                            {
                                Marshal.Copy(bytes, 0, buffer, size);
                                //此处已经完成转换
                                Employee emp = (Employee)Marshal.PtrToStructure(buffer, typeof(Employee));
                                
                                //省略很多代码
                            }
                            catch (Exception ex)
                            {
                                throw new Exception("Error when Copying bytes from interface to Employee", ex);
                            }
                            finally
                            {
                                Marshal.FreeHGlobal(buffer);
                            }
                        }
                    }
                    else
                    {
                        throw new Exception(string.Format("Error. Can`t not find the interface file at '{0}'", path));
                    }
    
                }
                catch (Exception ex)
                {
                    throw new Exception("Error when getting data from interface file.", ex);
                }
            }
  • 相关阅读:
    CXX解析CSV文件
    linux通过cifs挂载windows共享目录
    oracle生产环境存储过程调试方案
    imp导入库表空间找不到问题记录
    银行怎么盘头寸
    jQuery插件之【jqGrid】常用语法整理-【更新】
    Jquery一些笔记
    request对象的五个集合
    jQuery插件之【jqGrid】常用语法整理-【更新】
    MVC中几种常用ActionResult
  • 原文地址:https://www.cnblogs.com/xachary/p/3745063.html
Copyright © 2020-2023  润新知