public void removeFile(string name, inode n, int index) { inode _node = null; if (n == null) { _node = node[workDir]; listView.Items.RemoveAt(index); } else { _node = n; } int id = datablock[_node.getBlock(0)].removeInode(name); //找到删除文件的inode _node = node[id]; for (int i = 0;; i++) //释放inodetable中信息 { string _name = datablock[_node.getBlock(0)].findInode(0); if (_name != null) { removeFile(_name, node[id], -1); } else { break; } } List <int> b = _node.getBlockPtr().ToList <int>(); //获得该节点占用的全部块 blockMap.release(b); //释放块位图 nodeMap.release(id); //释放节点位图 IOFormatter.getInstance().Serialize(IOStream.getInstance(), datablock); }
public void reNameFile(string newName, int _index) //重命名文件 { inode _node = node[workDir]; datablock[_node.getBlock(0)].reNameInode(newName, _index); //在父目录的inodetable中进行修改 IOFormatter.getInstance().Serialize(IOStream.getInstance(), datablock); }
private void boot() { Stream stream = new FileStream("block.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); if (0 == stream.Length) { superBlock superblock = new superBlock(1024, 4096); dataBlock block = new dataBlock(); block.data = superblock; datablock[0] = block; initBoot(); ((blockBitmap)datablock[2].data).findUnuse(1); } inode root = new inode(); List <int> b = new List <int>(); b.Add(4); root.init(0, b, "文件夹", DateTime.Now); ((inode[])datablock[3].data)[0] = root; dataBlock data = new dataBlock(); ((blockBitmap)datablock[2].data).findUnuse(4); List <int> nodes = ((inodeBitmap)datablock[1].data).findUnuse(1); datablock[4] = new dataBlock(); datablock[4].createInode("..", -1); datablock[4].createInode(".", nodes[0]); IOFormatter.getInstance().Serialize(IOStream.getInstance(), datablock); }
public Boolean saveFile(string content) { int num = node[selectedFile].getBlockNum(); //获取文件已有磁盘块数目 byte[] buffer = Encoding.Default.GetBytes(content); int n = buffer.Length / 100; //计算所需磁盘块 int offset = buffer.Length % 100; if (n > 13) { return(false); } List <int> mem; if (offset > 0) { mem = blockMap.findUnuse(n + 1 - num); } else { mem = blockMap.findUnuse(n - num); } if (mem == null && n - num > 0) //需要新块但找不到空的磁盘块 { return(false); } for (int i = 0; i <= n; i++) { string con; if (i < n) { con = Encoding.Default.GetString(buffer, 100 * i, 100); } else { con = Encoding.Default.GetString(buffer, 100 * i, offset); } if (node[selectedFile].getBlock(i) == 0) { if (datablock[mem[0]] == null) { datablock[mem[0]] = new dataBlock(); } node[selectedFile].setBlock(mem[0], i); //为文件分配新的磁盘块 datablock[mem[0]].data = con; //存储信息 mem.RemoveAt(0); } else { datablock[node[selectedFile].getBlock(i)].data = con; } } node[selectedFile].setTime(DateTime.Now); IOFormatter.getInstance().Serialize(IOStream.getInstance(), datablock); listItems(workDir); return(true); }
private dataBlock[] datablock = new dataBlock[4096]; //模拟磁盘块的数组 private MemoryInterface() { if (0 == IOStream.getInstance().Length) { boot(); } datablock = (dataBlock[])IOFormatter.getInstance().Deserialize(IOStream.getInstance()); }
public MemoryManage(ListView listView) { this.listView = listView; if (0 == IOStream.getInstance().Length) { initBoot(); } datablock = (dataBlock[])IOFormatter.getInstance().Deserialize(IOStream.getInstance()); node = (inode[])datablock[3].data; blockMap = (blockBitmap)datablock[2].data; nodeMap = (inodeBitmap)datablock[1].data; listItems(workDir); }
public Boolean createEntry(string type, string _name) //创建新的文件 { int parent = -1; inode _node = null; if (_name != null) //点击文件夹创建 { parent = datablock[node[workDir].getBlock(0)].findInode(_name); //选中文件夹为父目录 } else //直接新建 { parent = workDir; //当前目录为父目录 } _node = node[parent]; List <int> nodeLoc = nodeMap.findUnuse(1); //找到未使用的inode节点 List <int> blockLoc = blockMap.findUnuse(1); //找到空闲磁盘块 if (nodeLoc == null || blockLoc == null) //inodeMap或blockMap用尽 { return(false); } if (datablock[blockLoc[0]] == null) //磁盘块未初始化 { datablock[blockLoc[0]] = new dataBlock(); if (type == "文件夹") { initDir(blockLoc[0], parent, nodeLoc[0]); } } if (node[nodeLoc[0]] == null) //inode为初始化 { node[nodeLoc[0]] = new inode(); } string name = "新建" + type; name = datablock[_node.getBlock(0)].createInode(name, nodeLoc[0]); if (_name == null) { setViewItem(name, type, 0, DateTime.Now); } node[nodeLoc[0]].init(nodeLoc[0], blockLoc, type, DateTime.Now); IOFormatter.getInstance().Serialize(IOStream.getInstance(), datablock); return(true); }
private void initBoot() { Stream stream = new FileStream("super.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); if (0 == stream.Length) { superBlock superblock = new superBlock(1024, 4096); dataBlock boot = new dataBlock(); boot.data = superblock; datablock = new dataBlock[4096]; node = new inode[1024]; blockMap.findUnuse(1); datablock[0] = boot; } inode root = new inode(); List <int> b = new List <int>(); b.Add(4); root.init(0, b, "文件夹", DateTime.Now); node[0] = root; dataBlock data = new dataBlock(); blockMap.findUnuse(4); List <int> nodes = nodeMap.findUnuse(1); datablock[1] = new dataBlock(); datablock[1].data = nodeMap; datablock[2] = new dataBlock(); datablock[2].data = blockMap; datablock[3] = new dataBlock(); datablock[3].data = node; datablock[4] = new dataBlock(); initDir(4, -1, nodes[0]); IOFormatter.getInstance().Serialize(IOStream.getInstance(), datablock); }
public void write() { IOFormatter.getInstance().Serialize(IOStream.getInstance(), datablock); }