byte[] buf = File.ReadAllBytes(filePath); // ファイル全体を一括読み込みしてすぐにファイルを閉じる int fileSize = buf.Length; // ファイルサイズ int structSize = Marshal.SizeOf<Form1.usrData>(); // 構造体サイズ IntPtr ptr = Marshal.AllocCoTaskMem(structSize); // 単一レコード分のメモリを確保 Form1.usrData[] dataArray = new Form1.usrData[fileSize / structSize]; // 総レコード数を求めて配列を準備 for (int n = 0; n < dataArray.Length; n++) { Marshal.Copy(buf, n * structSize, ptr, structSize); // バッファ内のbuf[n]~buf[n+structSize-1] の範囲を転写 dataArray[n] = Marshal.PtrToStructure<Form1.usrData>(ptr); // 構造体として取得して順次配列に入れていく } Marshal.FreeHGlobal(ptr); // メモリ解放 表示処理(dataArray);
var dataList = new List<Form1.usrData>(); using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { int structSize = Marshal.SizeOf<Form1.usrData>(); // 構造体サイズ IntPtr ptr = Marshal.AllocCoTaskMem(structSize); // 単一レコード分のメモリを確保 byte[] buf = new byte[structSize]; // ファイル全体ではなく 1 レコード分だけのバッファ while (fs.Read(buf, 0, structSize) == structSize) // バッファの buf[0]~buf[structSize-1] の位置に次のレコードを読み取る { Marshal.Copy(buf, 0, ptr, structSize); // バッファ内のbuf[0]~buf[structSize-1] の範囲を転写 dataList.Add(Marshal.PtrToStructure<Form1.usrData>(ptr)); // 構造体として取得して順次 List<> に入れていく } Marshal.FreeCoTaskMem(ptr); // メモリ開放 } 表示処理(dataList);