private void remove(ref CompoundCmd cmd, string name, int parent) { inode _node = MemoryInterface.getInstance().getInodeByIndex(parent); cmd.newOpe(new EditCmd(parent)); int id = MemoryInterface.getInstance().getDataBlockByIndex(_node.getBlock(0)).removeInode(name); //找到删除文件的inode _node = MemoryInterface.getInstance().getInodeByIndex(id); cmd.newOpe(new DeleteCmd(id)); if (_node.getType().Equals("文件夹")) { for (int i = 0; ; i++) //释放inodetable中信息 { string _name = MemoryInterface.getInstance().getDataBlockByIndex(_node.getBlock(0)).findInode(2); if (_name != null) { remove(ref cmd, _name, id); } else { break; } } } List <int> b = _node.getBlockPtr().ToList <int>(); //获得该节点占用的全部块 MemoryInterface.getInstance().releaseBlock(b); //释放块位图 MemoryInterface.getInstance().releaseInode(id); //释放节点位图 }
public Directory(int nodeIndex, string name) { entries = new List <Entry>(); this.name = name; this.node = nodeIndex; this.time = MemoryInterface.getInstance().getInodeByIndex(nodeIndex).getTime(); int nodeTableBlock = MemoryInterface.getInstance().getInodeByIndex(nodeIndex).getBlock(0); for (int i = 2; ; i++) { string _name = MemoryInterface.getInstance().getDataBlockByIndex(nodeTableBlock).findInode(i); if (_name == null) { break; } inode _node = MemoryInterface.getInstance().getInodeByIndex(MemoryInterface.getInstance().getInodeIndexByName(nodeIndex, _name)); if (_node.getType().Equals("文件")) { File file = new File(_node, _name); entries.Add(file); } else { Directory dir = new Directory(_node.id, _name); entries.Add(dir); } } }
public override void reNameEntry(string newName, int _index) { inode _node = MemoryInterface.getInstance().getInodeByIndex(node); UndoManager.getInstance().newOpe(new EditCmd(node)); string oldName = MemoryInterface.getInstance().getDataBlockByIndex(_node.getBlock(0)).reNameInode(newName, _index + 2); //在父目录的inodetable中进行修改 entries[_index].name = newName; MemoryInterface.getInstance().write(); }
public Cmd(int node_index) { inode node = MemoryInterface.getInstance().getInodeByIndex(node_index); this.node = (inode)node.Clone(); this.list = new List <dataBlock>(); for (int i = 0; i < 13; i++) { if (node.getBlock(i) == 0) { break; } list.Add((dataBlock)MemoryInterface.getInstance().getDataBlockByIndex(node.getBlock(i)).Clone()); } }
public override string createEntry(string _name, string type) { int parent = -1; UndoableCmd cmd1 = new EditCmd(node); if (_name != null) //点击文件夹创建 { parent = MemoryInterface.getInstance().getInodeIndexByName(node, _name); //选中文件夹为父目录 } else //直接新建 { parent = node; //当前目录为父目录 } List <int> nodeLoc = MemoryInterface.getInstance().getRequireInodes(1); //找到未使用的inode节点 List <int> blockLoc = MemoryInterface.getInstance().getRequireBlocks(1); //找到空闲磁盘块 if (nodeLoc == null || blockLoc == null) //inodeMap或blockMap用尽 { return(null); } string name = null; if (type.Equals("文件夹")) { name = initDir(blockLoc, parent, nodeLoc[0]); entries.Add(new Directory(nodeLoc[0], name)); } else { name = "新建文件"; name = MemoryInterface.getInstance().addNewInodeTableItem(MemoryInterface.getInstance().getInodeByIndex(parent).getBlock(0), name, nodeLoc[0]); inode temp = MemoryInterface.getInstance().getInodeByIndex(nodeLoc[0]); temp.init(nodeLoc[0], blockLoc, "文件", DateTime.Now); entries.Add(new File(temp, name)); } UndoableCmd cmd2 = new AddCmd(nodeLoc[0]); CompoundCmd cmd3 = new CompoundCmd(); cmd3.newOpe(cmd1); cmd3.newOpe(cmd2); UndoManager.getInstance().newOpe(cmd3); MemoryInterface.getInstance().write(); return(name); }
private int calculate(inode _node) //计算文件大小 { int[] ptr = _node.getBlockPtr(); string content = ""; for (int i = 0; i < 13; i++) //遍历该文件的所有块,计算大小 { if (MemoryInterface.getInstance().getDataBlockByIndex(ptr[i]) != null && MemoryInterface.getInstance().getDataBlockByIndex(ptr[i]).data != null && !MemoryInterface.getInstance().getDataBlockByIndex(ptr[i]).data.Equals("")) { content += MemoryInterface.getInstance().getDataBlockByIndex(ptr[i]).data; continue; } break; } byte[] sarr = Encoding.Default.GetBytes(content); return(sarr.Length); }
public File(inode _node, string name) { string type = _node.getType(); DateTime time = _node.getTime(); this.size = calculate(_node); this.name = name; this.node = _node.id; this.time = _node.getTime(); int num = _node.getBlockNum(); //获取磁盘块数目 string content = ""; for (int i = 0; i < num; i++) //遍历磁盘块 { content += MemoryInterface.getInstance().getDataBlockByIndex(_node.getBlock(i)).data; } this.content = content; }