Esempio n. 1
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);     //释放节点位图
        }
Esempio n. 2
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);
                }
            }
        }
Esempio n. 3
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();
        }
Esempio n. 4
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());
            }
        }
Esempio n. 5
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);
        }
Esempio n. 6
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);
        }
Esempio n. 7
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;
        }