private void CommitChildren() { if (children != null) { // Create empty byte array byte[] childListBytes = new byte[DATA_SECTOR.MaxDataLength(drive.Disk.BytesPerSector)]; int i = 0; foreach (VirtualNode childNode in children.Values) { int childAddress = childNode.nodeSector; BitConverter.GetBytes(childAddress).CopyTo(childListBytes, i * 4); i++; } DATA_SECTOR data = new DATA_SECTOR(drive.Disk.BytesPerSector, 0, childListBytes); drive.Disk.WriteSector(sector.FirstDataAt, data.RawBytes); // Update entry count (sector as DIR_NODE).EntryCount = children.Count; // save the entry count drive.Disk.WriteSector(nodeSector, sector.RawBytes); } }
private DRIVE_INFO sector; // caching entire sector for now public VirtualDrive(DiskDriver disk, int driveInfoSector, DRIVE_INFO sector) { this.disk = disk; this.driveInfoSector = driveInfoSector; this.bytesPerDataSector = DATA_SECTOR.MaxDataLength(disk.BytesPerSector); this.sector = sector; }
public void Format(DiskDriver disk) { // wipe all sectors of disk and create minimum required DRIVE_INFO, DIR_NODE and DATA_SECTOR //how many sectors int numSectors = disk.SectorCount; FREE_SECTOR freeSector = new FREE_SECTOR(disk.BytesPerSector); for (int lba = 0; lba < numSectors; lba++) { disk.WriteSector(lba, freeSector.RawBytes); } DRIVE_INFO diSector1 = new DRIVE_INFO(disk.BytesPerSector, ROOT_DIR_SECTOR); disk.WriteSector(0, diSector1.RawBytes); DIR_NODE rootDirSector = new DIR_NODE(disk.BytesPerSector, ROOT_DATA_SECTOR, FSConstants.ROOT_DIR_NAME, 0); disk.WriteSector(ROOT_DIR_SECTOR, rootDirSector.RawBytes); DATA_SECTOR rootDataSector = new DATA_SECTOR(disk.BytesPerSector, 0, new byte[DATA_SECTOR.MaxDataLength(disk.BytesPerSector)]); disk.WriteSector(ROOT_DATA_SECTOR, rootDataSector.RawBytes); }