private void RefreshCache(int SectorNumber) { if (SectorCached == SectorNumber) { return; } if (SectorCached != -1 && CommitCacheRequired) { CommitCacheRequired = false; StoreM2(SectorCached, Cache); } byte b = 0; var data = GetSector(SectorNumber, ref b); try { unsafe { fixed(byte *ptrBuffer = &data[0]) { Cache = (M2Sector) Marshal.PtrToStructure(new IntPtr(ptrBuffer), typeof(M2Sector)); } } SectorCached = SectorNumber; } catch (Exception e) { STrace.Debug(typeof(GR2).FullName, e.ToString()); SectorCached = -1; } }
private void StoreM2(int sector, M2Sector M2) { using (var sw = File.OpenWrite(FileName)) { var data = new byte[512]; sw.Seek(sector * 512 + 512, SeekOrigin.Begin); unsafe { fixed(byte *ptrBuffer = &data[0]) { Marshal.StructureToPtr(M2, new IntPtr(ptrBuffer), true); } } sw.Write(data, 0, data.GetLength(0)); sw.Close(); Repository.TransactionLog.SectorTouch(FileName, sector); } }