Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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);     //释放节点位图
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        public override void redo()
        {
            base.redo();
            MemoryInterface.getInstance().releaseInode(node.id);
            List <int> temp = new List <int>();

            MemoryInterface.getInstance().releaseBlock(node.getBlockPtr().ToList <int>());
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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();
        }
Exemplo n.º 7
0
        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();
        }
Exemplo n.º 8
0
 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)));
     }
 }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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());
            }
        }
Exemplo n.º 11
0
        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);
        }
Exemplo n.º 12
0
        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);
        }
Exemplo n.º 13
0
        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;
        }
Exemplo n.º 14
0
 public override void redo()
 {
     base.redo();
     MemoryInterface.getInstance().setInodeByIndex(node.id, node);
     MemoryInterface.getInstance().setDataBlockByIndex(node.getBlockPtr().ToList <int>(), new_data);
 }