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); } } }
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 override bool write(string content) { this.content = content; int num = MemoryInterface.getInstance().getInodeByIndex(node).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 = MemoryInterface.getInstance().getRequireBlocks(n + 1 - num); } else { mem = MemoryInterface.getInstance().getRequireBlocks(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 (MemoryInterface.getInstance().getInodeByIndex(node).getBlock(i) == 0) { MemoryInterface.getInstance().getInodeByIndex(node).setBlock(mem[0], i); //为文件分配新的磁盘块 MemoryInterface.getInstance().getDataBlockByIndex(mem[0]).data = con; //存储信息 mem.RemoveAt(0); } else { MemoryInterface.getInstance().getDataBlockByIndex(MemoryInterface.getInstance().getInodeByIndex(node).getBlock(i)).data = con; } } MemoryInterface.getInstance().getInodeByIndex(node).setTime(DateTime.Now); MemoryInterface.getInstance().write(); this.size = calculate(MemoryInterface.getInstance().getInodeByIndex(node)); return(true); }
public override void redo() { base.redo(); MemoryInterface.getInstance().releaseInode(node.id); List <int> temp = new List <int>(); MemoryInterface.getInstance().releaseBlock(node.getBlockPtr().ToList <int>()); }
public override void undo() { base.undo(); MemoryInterface.getInstance().setInodeByIndex(node.id, node); List <int> temp = new List <int>(); MemoryInterface.getInstance().setDataBlockByIndex(node.getBlockPtr().ToList <int>(), list); }
public override void removeEntry(int selectedItem, string name) { entries.RemoveAt(selectedItem); CompoundCmd cmd = new CompoundCmd(); remove(ref cmd, name, node); UndoManager.getInstance().newOpe(cmd); MemoryInterface.getInstance().write(); }
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 EditCmd(int node_index) : base(node_index) { new_data = new List <dataBlock>(); for (int i = 0; i < 13; i++) { if (node.getBlock(i) == 0) { break; } new_data.Add(MemoryInterface.getInstance().getDataBlockByIndex(node.getBlock(i))); } }
private string initDir(List <int> blocks, int parent, int current) { string name = "新建文件夹"; name = MemoryInterface.getInstance().addNewInodeTableItem(MemoryInterface.getInstance().getInodeByIndex(parent).getBlock(0), name, current); MemoryInterface.getInstance().addNewInodeTableItem(blocks[0], "..", parent); MemoryInterface.getInstance().addNewInodeTableItem(blocks[0], ".", current); MemoryInterface.getInstance().getInodeByIndex(current).init(current, blocks, "文件夹", DateTime.Now); return(name); }
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; }
public override void redo() { base.redo(); MemoryInterface.getInstance().setInodeByIndex(node.id, node); MemoryInterface.getInstance().setDataBlockByIndex(node.getBlockPtr().ToList <int>(), new_data); }