Пример #1
0
        public byte[] ReadAllBytes(string filePath)
        {
            FileEntry file = null;

            foreach (var entry in IndexAria)
            {
                if (entry is FileEntry fe)
                {
                    if (fe.Name == filePath)
                    {
                        file = fe;
                    }
                }
            }

            if (file == null)
            {
                return(null);
            }

            var buf = new List <byte>();

            BlockBuffer.Offset = file.StartingBlock * BlockDevice.BlockSize;


            for (int i = 0; i < file.Length; i++)
            {
                buf.Add(BlockBuffer.ReadByte());
            }

            return(buf.ToArray());
        }
Пример #2
0
        private void WriteIndexAria()
        {
            var endOfVolume = BlockDevice.BlockSize * BlockDevice.TotalBlocks;
            var offset      = 1;

            foreach (var structure in IndexAria)
            {
                BlockBuffer.Offset = endOfVolume - offset * 64;

                structure.Write(BlockBuffer);

                if (structure.Continuations > 0)
                {
                    offset            += (structure.Name.Length / 64) + 1;
                    BlockBuffer.Offset = endOfVolume - offset * 64;
                    BlockBuffer.WriteString(structure.Name);
                }

                offset++;
            }
        }
Пример #3
0
        private void ReadIndexAria()
        {
            IndexAria.Clear();

            var endOfVolume = BlockDevice.BlockSize * BlockDevice.TotalBlocks;
            var offset      = 1;

            while (endOfVolume > offset * 64)
            {
                BlockBuffer.Offset = endOfVolume - offset * 64;

                var id = BlockBuffer.ReadByte();
                BlockBuffer.Offset--;

                switch (id)
                {
                case 0x01:     // VolumeIdentifier
                {
                    var x = new VolumeIdentifier();
                    x.Read(BlockBuffer);
                    IndexAria.Add(x);
                }
                break;

                case 0x02:     // Starting Marker Entry
                {
                    var x = new StartingMarkerEntry();
                    x.Read(BlockBuffer);
                    IndexAria.Add(x);
                    return;
                }

                case 0x10:     // Unused Entry
                {
                    var x = new UnusedEntry();
                    x.Read(BlockBuffer);
                    IndexAria.Add(x);
                }
                break;

                case 0x11:     // Directory Entry
                {
                    var x = new DirectoryEntry();
                    x.Read(BlockBuffer);
                    IndexAria.Add(x);
                    if (x.Continuations > 0)
                    {
                        offset            += x.Continuations + 1;
                        BlockBuffer.Offset = endOfVolume - offset * 64;
                        x.Name             = BlockBuffer.ReadString();
                    }
                }
                break;

                case 0x12:     // File Entry
                {
                    var x = new FileEntry();
                    x.Read(BlockBuffer);
                    IndexAria.Add(x);

                    if (x.Continuations > 0)
                    {
                        offset            += x.Continuations + 1;
                        BlockBuffer.Offset = endOfVolume - offset * 64;
                        x.Name             = BlockBuffer.ReadString();
                    }
                }
                break;

                case 0x18:     // Unusable Entry
                {
                    var x = new UnusableEntry();
                    x.Read(BlockBuffer);
                    IndexAria.Add(x);
                }
                break;

                case 0x19:     // Deleted Directory Entry
                {
                    var x = new DeletedDirectoryEntry();
                    x.Read(BlockBuffer);
                    IndexAria.Add(x);

                    if (x.Continuations > 0)
                    {
                        offset            += x.Continuations + 1;
                        BlockBuffer.Offset = endOfVolume - offset * 64;
                        x.Name             = BlockBuffer.ReadString();
                    }
                }
                break;

                case 0x1A:     // Deleted File Entry
                {
                    var x = new DeletedFileEntry();
                    x.Read(BlockBuffer);
                    IndexAria.Add(x);

                    if (x.Continuations > 0)
                    {
                        offset            += x.Continuations + 1;
                        BlockBuffer.Offset = endOfVolume - offset * 64;
                        x.Name             = BlockBuffer.ReadString();
                    }
                }
                break;
                }

                offset++;
            }
        }
Пример #4
0
 public SimpleFS(IBlockDevice blockDevice)
 {
     BlockDevice = blockDevice;
     BlockBuffer = new BlockBuffer(BlockDevice);
 }
Пример #5
0
 public abstract void Read(BlockBuffer bb);
Пример #6
0
 public abstract void Write(BlockBuffer bb);