public void WriteSectors(long firstSectorIndex, byte[] data) { if (m_attributeRecord is NonResidentAttributeRecord) { NonResidentAttributeData attributeData = new NonResidentAttributeData(m_volume, m_fileRecord, (NonResidentAttributeRecord)m_attributeRecord); attributeData.WriteSectors(firstSectorIndex, data); } else { byte[] recordData = ((ResidentAttributeRecord)m_attributeRecord).Data; long totalSectors = (long)Math.Ceiling((double)recordData.Length / m_volume.BytesPerSector); long highestSectorIndex = Math.Max(totalSectors - 1, 0); if (firstSectorIndex < 0 || firstSectorIndex > highestSectorIndex) { throw new ArgumentOutOfRangeException("firstSectorIndex is not within the valid range"); } int offset = (int)firstSectorIndex * m_volume.BytesPerSector; int bytesToWrite; if (offset + data.Length <= recordData.Length) { bytesToWrite = data.Length; } else { bytesToWrite = recordData.Length - offset; } ByteWriter.WriteBytes(recordData, offset, data, bytesToWrite); if (m_fileRecord != null) { m_volume.UpdateFileRecord(m_fileRecord); } } }
private void WriteIndexRecord(long recordIndex, IndexRecord indexRecord) { long sectorsPerIndexRecord = m_rootRecord.BytesPerIndexRecord / m_volume.BytesPerSector; long sectorIndex = recordIndex * sectorsPerIndexRecord; m_indexAllocationData.WriteSectors(sectorIndex, indexRecord.GetBytes((int)m_rootRecord.BytesPerIndexRecord, true)); }