首页 > 代码库 > 使用Marshal.Copy把Txt行数据转为Struct类型值

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