예제 #1
0
        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();
        }
예제 #2
0
        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);
        }