使用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);
            }
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值