/// <summary> /// Writes file payload to the filesystem and mark the sectors as allocated. /// </summary> /// <param name="data">Data to write to the filesystem.</param> /// <param name="extents">Information about extents to write the data to.</param> internal void WriteFileData(byte[] data, DragonDosDirectoryEntry.Extent[] extents) { int dataOffset = 0; foreach (var extent in extents) { int lsn = extent.Lsn; int sectorCnt = extent.Length; while (sectorCnt-- > 0) { int length = Math.Min(SectorSize, data.Length - dataOffset); WriteSector(lsn, data, dataOffset, length); SetSectorAllocated(lsn++, true); dataOffset += length; } } }
/// <summary> /// Create a set of directory entries for a file. /// </summary> /// <param name="filename">Filename</param> /// <param name="extents">Ordered list of extents containing the file payload data.</param> /// <param name="dirInx">Orderes list of directory entry indexes to use.</param> /// <returns>Orderes list of directory entries</returns> private DragonDosDirectoryEntry[] CreateDirectoryEntries(string filename, DragonDosDirectoryEntry.Extent[] extents, int[] dirInx, int lastSectorSize) { var dirEntries = new DragonDosDirectoryEntry[dirInx.Length]; int maxExtents; int extentOffset = 0; for (int i = 0; i < dirInx.Length; i++ ) { var dir = new DragonDosDirectoryEntry() {Flags = 0}; if (i == 0) { dir.Filename = filename; dir.IsExtensionEntry = false; maxExtents = 4; } else { dir.IsExtensionEntry = true; maxExtents = 7; } if (i == dirInx.Length-1) { dir.LastSectorSize = lastSectorSize; } else { dir.NextEntry = dirInx[i + 1]; } dir.Extents = new DragonDosDirectoryEntry.Extent[Math.Min(maxExtents, extents.Length - extentOffset)]; Array.Copy(extents, extentOffset, dir.Extents, 0, dir.Extents.Length); extentOffset += dir.Extents.Length; dirEntries[i] = dir; } return dirEntries; }
/// <summary> /// Sets the directory entry at a given index. /// </summary> /// <param name="index"></param> /// <param name="entry"></param> private void SetDirectoryEntry(int index, DragonDosDirectoryEntry entry) { int sector = index / DirectoryEntryCount + DirectoryEntryOffset; int offset = index % DirectoryEntryCount * DirectoryEntrySize; entry.Encode(directoryTrack[sector], offset); }