コード例 #1
0
        /// <summary>
        /// Write a sector containing file data to the disk
        /// </summary>
        /// <param name="sector"></param>
        /// <param name="fileSector"></param>
        public override void WriteFileSector(int sector, FileSector fileSector)
        {
            var sectorData = new byte[128];

            Array.Clear(sectorData, 0, 128);
            Array.Copy(fileSector.Data, sectorData, fileSector.ByteCount);

            sectorData[125] = (byte)((fileSector.NextSector & 0xff00) >> 8);
            sectorData[126] = (byte)(fileSector.NextSector & 0xff);
            sectorData[127] = (byte)fileSector.ByteCount;
            WriteSector(sector, sectorData);
        }
コード例 #2
0
        /// <summary>
        /// Read a sector containing file data from the disk
        /// </summary>
        /// <param name="sector"></param>
        /// <returns></returns>
        public override FileSector ReadFileSector(int sector)
        {
            var fileSector = new FileSector();
            fileSector.Data = new byte[125];

            var sec = ReadSector(sector);
            fileSector.FileHandle = -1;
            fileSector.NextSector = (sec[125] << 8) + sec[126];
            fileSector.ByteCount = sec[127] & 0x7F;
            fileSector.Sector = sector;
            for (int i = 0; i < 125; i++) fileSector.Data[i] = sec[i];

            return fileSector;
        }
コード例 #3
0
        /// <summary>
        /// Read a sector containing file data from the disk
        /// </summary>
        /// <param name="sector"></param>
        /// <returns></returns>
        public virtual FileSector ReadFileSector(int sector)
        {
            var fileSector = new FileSector();
            fileSector.Data = new byte[125];

            var sec = ReadSector(sector);
            fileSector.Sector = sector;
            fileSector.FileHandle = (sec[125] & 0xfc) >> 2;
            fileSector.NextSector = ((sec[125] & 0x3) << 8) + sec[126];
            fileSector.ByteCount = sec[127] & 0x7F;
            for (int i = 0; i < 125; i++) fileSector.Data[i] = sec[i];

            return fileSector;
        }
コード例 #4
0
        /// -----------------------------------------------------------------------------
        /// <summary>
        /// Adds a file to the disk
        /// </summary>
        /// <param name="Filename">Name of file being added</param>
        /// <param name="data">File data</param>
        /// <remarks>
        /// </remarks>
        /// -----------------------------------------------------------------------------
        public override void AddFile(string Filename, byte[] data)
        {
            DirectoryEntry entry;
            int curSector;
            int nextSector;
            int len;

            Attach();

            //Be sure filename is valid
            if (!ValidFileName(Filename))
            {
                throw new InvalidFileNameException();
            }

            //If file already exists, delete it
            entry = FindDirectoryEntry(Filename);
            if (entry != null)
            {
                DeleteFile(Filename);
            }

            // Check for disk space
            int dataLength = 0;
            if (data != null) dataLength = data.Length;
            int requiredSectors = (dataLength / 125);
            if (dataLength % 125 > 0) requiredSectors += 1;
            if (requiredSectors == 0) requiredSectors = 1;      // Files are always at least one sector
            if (requiredSectors > UnusedSectors()) throw new InsufficientDiskSpaceException();

            // Find open directory entry
            entry = GetOpenEntry();
            if (entry == null) throw new DirectoryFullException();

            entry.FileName = Filename;
            entry.Deleted = false;
            entry.EntryInUse = true;
            entry.Locked = false;
            entry.OpenForOutput = false;
            entry.StartSector = sectorMap.GetNextAvailableSector();
            entry.NumSectors = requiredSectors;

            curSector = entry.StartSector;
            for (int i = 0; i <= requiredSectors - 1; i++)
            {
                if ((dataLength - (i * 125)) <= 125)
                {
                    len = dataLength - (i * 125);
                    nextSector = 0;
                }
                else
                {
                    len = 125;
                    nextSector = sectorMap.GetNextAvailableSector();
                }

                var fileSec = new FileSector();
                fileSec.FileHandle = entry.FileNumber;
                fileSec.NextSector = nextSector;
                fileSec.ByteCount = len;
                fileSec.Data = new byte[125];

                if (data != null) Array.Copy(data, i * 125, fileSec.Data, 0, len);

                WriteFileSector(curSector, fileSec);

                curSector = nextSector;
            }

            WriteDirectoryEntry(entry);
            WriteSectorMap();

            //Refresh the directory
            ReadDirectory();

            UpdateUnusedSectors();
        }
コード例 #5
0
        /// <summary>
        /// Write a sector containing file data to the disk
        /// </summary>
        /// <param name="sector"></param>
        /// <param name="fileSector"></param>
        public virtual void WriteFileSector(int sector, FileSector fileSector)
        {
            var sectorData = new byte[128];

            Array.Clear(sectorData, 0, 128);
            Array.Copy(fileSector.Data, sectorData, fileSector.ByteCount);

            var b = (byte)(fileSector.FileHandle << 2);
            b |= (byte)((fileSector.NextSector & 0x300) >> 8);
            sectorData[125] = b;
            sectorData[126] = (byte)(fileSector.NextSector & 0xff);
            sectorData[127] = (byte)fileSector.ByteCount;
            WriteSector(sector, sectorData);
        }