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); }
//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); }
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); }
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(); }