public static void Main(string[] args) { /* * int nblocks=100; * BitArray occupied = new BitArray(nblocks, false); * // ... preenche occupied * occupied.Set(10, true); * occupied.Set(2, true); * for (int i = 50; i < 56; i++) * occupied.Set(i, true); * * * MemoryStream ms = new MemoryStream(); * BinaryFormatter BF = new BinaryFormatter(); * BF.Serialize(ms, occupied); * Byte[] bytes = ms.GetBuffer(); * // bytes contem os dados a serem gravados nos setores * * BinaryWriter Writer = new BinaryWriter(File.OpenWrite("teste.dat")); * Writer.Write(bytes); * Writer.Flush(); * Writer.Close(); * Console.WriteLine ("Escreveu!"); * * BinaryReader Reader = new BinaryReader(File.OpenRead("teste.dat")); * // Lê a MESMA quantidade que foi escrita * Byte[] bytes_in = Reader.ReadBytes(bytes.Length); * * MemoryStream mem_in = new MemoryStream(bytes_in); * BitArray ba_in = (BitArray)BF.Deserialize(mem_in); * * for (int i = 0; i < nblocks; i++) * if (ba_in.Get(i) != occupied.Get(i)) { * Console.WriteLine("Posição {0} não corresponde!", i); * } else { * Console.WriteLine("Posição {0} ok -- {1}", i, ba_in.Get(i)); * } * Reader.Close(); */ // Disco "grande" para ocupar vários blocos de bitmap // 200M -> 2 blocos de bitmap Disk d = new Disk("teste.dat", 200 * 1000 * 1000 / Disk.SectorSize); TFS.mkfs(d); TFS fs = TFS.mount(d); d.Dispose(); }
public static TFS mount(Disk d) { Byte[] block = new Byte[BlockSize]; d.ReadSector(0, block); MemoryStream ms = new MemoryStream(block); BinaryFormatter bf = new BinaryFormatter(); SuperBlock sb = (SuperBlock)bf.Deserialize(ms); Byte[] bmbytes = new Byte[sb.nblocks_bm * BlockSize]; for (int i = 0; i < sb.nblocks_bm; i++) { d.ReadSector(i + 1, block); Array.Copy(block, 0, bmbytes, i * BlockSize, BlockSize); } ms = new MemoryStream(bmbytes); BitArray bm = (BitArray)bf.Deserialize(ms); if (!bm.Get(0)) { throw new Exception("Bloco 0 não ocupado!\n"); } if (!bm.Get(sb.block_raiz)) { throw new Exception("Diretório raiz não está marcado ocupado\n"); } // lê bloco do diretório raiz TFS fs = new TFS(); fs.sb = sb; fs.root_dir = null; // depois associa o diretorio raiz deserializado fs.bm = bm; Console.WriteLine("Montou um TFS com \n" + "\t{0} blocos\n" + "\t{1} blocos de bitmap\n" + "\tDiretório raiz em {2}\n", sb.nblocks, sb.nblocks_bm, sb.block_raiz); return(fs); }