public void GetFreeInodeTest()
        {
            SuperBlock superBlock = new SuperBlock()
            {
                FreeBlockSize = 3,
                FreeBlock     = new List <int>()
                {
                    1, 2, 3
                },
                FreeInodeSize = 3,
                FreeInode     = new List <int>()
                {
                    1, 2, 3
                }
            };

            diskAdapterService.WriteSuperBlock(superBlock);
            int tFreeInode = diskManagementService.GetFreeInode(FileMode.Text);

            Assert.AreEqual(tFreeInode, 1);
            DiskInode diskInode = diskAdapterService.ReadDiskInode(tFreeInode);

            Assert.AreEqual(diskInode.Size, 0);
            Assert.AreEqual(diskInode.Number, 0);
            Assert.AreEqual(diskInode.Mode, 1);
        }
        public void WriteReadInodeTest()
        {
            DiskInode diskInode = new DiskInode()
            {
                Number = 10,
                Mode   = 1,
                Size   = 10,
                Addrs  = new List <int>()
                {
                    1, 2, 4, 6, 13, 567, 111, 121, 111, 90, 11, 22, 33
                }
            };
            DiskAdapterService diskAdapterService = new DiskAdapterService(_diskConnectService);

            diskAdapterService.WriteDiskInode(diskInode, 6);
            var reDiskInode = diskAdapterService.ReadDiskInode(6);

            Assert.AreEqual(reDiskInode.Number, diskInode.Number);
            Assert.AreEqual(reDiskInode.Mode, diskInode.Mode);
            Assert.AreEqual(reDiskInode.Size, diskInode.Size);
            for (int i = 0; i < Constant.Naddr; i++)
            {
                Assert.AreEqual(reDiskInode.Addrs[i], diskInode.Addrs[i]);
            }
        }
        public DiskInode ReadDiskInode(int inodeIndex)
        {
            int index;
            //i节点容器
            DiskInode diskInode = new DiskInode();

            diskInode.Addrs = new List <int>();
            byte[] bytes = new byte[Constant.Constant.Dinodesize];
            //读虚拟磁盘
            fileStream = _diskConnectService.GetFileStream();
            fileStream.Seek(
                Constant.Constant.Dinodestart + Constant.Constant.Dinodesize * inodeIndex,
                SeekOrigin.Begin
                );
            fileStream.Read(bytes, 0, Constant.Constant.Dinodesize);
            fileStream.Close();
            //字节转换
            diskInode.Number = BitConverter.ToInt32(bytes, 0);
            diskInode.Mode   = BitConverter.ToInt32(bytes, 4);
            diskInode.Size   = BitConverter.ToInt32(bytes, 8);
            for (index = 0; index < Constant.Constant.Naddr; index++)
            {
                diskInode.Addrs.Add(BitConverter.ToInt32(bytes, 12 + 4 * index));
            }
            return(diskInode);
        }
Exemple #4
0
        //TODO 未测试
        public void RetrieveInode(int index)
        {
            SuperBlock superBlock = _diskAdapterService.ReadSuperBlock();
            DiskInode  diskInode  = _diskAdapterService.ReadDiskInode(index);

            superBlock.FreeInodeSize++;
            superBlock.FreeInode.Add(index);
            _diskAdapterService.WriteSuperBlock(superBlock);
            RetrieveBlocks(diskInode.Addrs);
        }
Exemple #5
0
        private byte[] ReadBiteFile(int index)
        {
            DiskInode diskInode = _diskAdapterService.ReadDiskInode(index);

            byte[] bytes = new byte[diskInode.Size];
            int    i, count = 0;

            //取该文件所有块
            for (i = 0; i < diskInode.Number; i++)
            {
                Array.Copy(_diskAdapterService.ReadDataBlock(diskInode.Addrs[i], DataMode.Bytes).Bytes.ToArray(),
                           0, bytes, count,
                           diskInode.Size - count >= Constant.Constant.Blocksize ? Constant.Constant.Blocksize : diskInode.Size - count);
                count += Constant.Constant.Blocksize;
            }

            return(bytes);
        }
Exemple #6
0
        public void WriteDir(Dir dir, int index)
        {
            DiskInode diskInode = _diskAdapterService.ReadDiskInode(index);

            byte[] bytes =
                ByteConverter.ByteConverter.byteConverter.ToBytes(dir);
            RetrieveBlocks(diskInode.Addrs);
            int        size      = (int)(bytes.Length / Constant.Constant.Blocksize) + 1;
            List <int> freeBlock = GetFreeBlocks(size);

            //文件内容写入磁盘
            WriteBiteFile(freeBlock, bytes);
            //修改i节点并写回
            diskInode.Size   = bytes.Length;
            diskInode.Number = size;
            diskInode.Addrs  = freeBlock;
            _diskAdapterService.WriteDiskInode(diskInode, index);
        }
        public void WriteDiskInode(DiskInode diskInode, int index)
        {
            //i节点字节化
            byte[]     bytes     = new byte[Constant.Constant.Blocksize];
            int        count     = 0;
            List <int> blockInfo = new List <int>();

            blockInfo.Add(diskInode.Number);
            blockInfo.Add(diskInode.Mode);
            blockInfo.Add(diskInode.Size);
            blockInfo.AddRange(diskInode.Addrs);
            blockInfo.ForEach(delegate(int inodeIndex) {
                Array.Copy(BitConverter.GetBytes(inodeIndex),
                           0, bytes, count, 4);
                count += 4;
            });
            //i节点写入虚拟磁盘
            fileStream = _diskConnectService.GetFileStream();
            fileStream.Seek(
                Constant.Constant.Dinodestart + Constant.Constant.Dinodesize * index,
                SeekOrigin.Begin);
            fileStream.Write(bytes, 0, bytes.Length);
            fileStream.Close();
        }