public void Format(UInt32 inodeCapacity, UInt16 blockSizeKByte = 4)
{
if (inodeCapacity < 32)
{
throw new Exception("inode 至少为 32 个");
}
if (!new int[] { 1, 2, 4, 8 }.Contains(blockSizeKByte))
{
throw new Exception("block 大小只能为 1KB, 2KB, 4KB 或 8KB");
}
uint offset = 0;
offset += (uint)Utils.GetStructSize<_SuperBlock>();
offset += (inodeCapacity / 32 + 1) * 4;
offset += (uint)Utils.GetStructSize<_INode>() * inodeCapacity;
if (offset > deviceSize)
{
throw new Exception("inode 数量过大,结构超出存储介质最大空间");
}
// 可留给数据块位图和数据块区的大小
uint sizeRemain = deviceSize - offset;
// 全部留给数据块,可以有多少个数据块
uint blockCapacity = sizeRemain / blockSizeKByte >> 10;
if (blockCapacity < 128)
{
throw new Exception("磁盘空间太小,至少要可以容纳 128 个块");
}
// 删除 (blockCapacity / 32 + 1) * 4 大小的数据块,留作数据块位图使用
blockCapacity -= ((blockCapacity / 32 + 1) * 4 / blockSizeKByte) + 1;
// 初始化 superBlock
superBlock = SuperBlock.Create(this, inodeCapacity, (UInt16)(blockSizeKByte << 10), blockCapacity);
// 单个 inode BitVector 可容纳 32 位
inodeBitmaps = new UInt32[inodeCapacity / 32 + 1];
device.WriteArray(superBlock.pInodeBitVectors, inodeBitmaps, 0, inodeBitmaps.Length);
// 单个 block BitVector 可容纳 32 位
blockBitmaps = new UInt32[blockCapacity / 32 + 1];
device.WriteArray(superBlock.pBlockBitVectors, blockBitmaps, 0, blockBitmaps.Length);
// 写入根目录
INodeDirectory.Create(this);
Console.WriteLine("格式化成功。");
Console.WriteLine("SuperBlock: {0}", superBlock.ToString());
}