添加重要的命名空间:
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);
}
}
使用Marshal.Copy把Txt行数据转为Struct类型值,布布扣,bubuko.com