rename和mv命令都没有递归的选项,那么它是如何实现对文件夹进行改名的呢?(或者说,linux是如何管理目录的呢?)
我现在在用fuse做一个文件系统,用一层的目录假装是多层,并使用map管理(如在dir1下新建一个dir11,其实是新建了一个key为/dir1/dir11的map),(我大概知道linux文件改名应该是不需要递归的,但是我mkdir的时候它给我传入的就是绝对路径,我直接拿绝对路径做的map)但我使用mv,rename命令时,系统仅仅会调用一次rename函数,即使我在rename内部实现了所有key的改名,系统仍然不识别(仅认为改变了一个文件夹名)rename: from[/dir1] to[/dir6] flags[0],这个是rename传入的参数,就是说系统仅仅调用了一次dir1到dir6的改名,而它之下的目录并没有改变(之下的目录还是以 dir1 开头)
这个是我用于改名的函数    bool rename(const std::string &from, const std::string &to) {
        std::map<std::string, file_node>::iterator it = map_.find(from);
        if(it == map_.end()) { 
            std::map<std::string, dir_node>::iterator dit = dir_map_.find(from);
            if(dit == dir_map_.end()) {
                return false; 
            }else {
                std::map<std::string, dir_node>::iterator dit;
                for(dit = dir_map_.begin(); dit != dir_map_.end(); dit++) {
                    std::string dtmp = dit->first;
                    if(!dtmp.find(from)) {/* find "path" at 0, means key is start with "path" */
                        dtmp.erase(0, from.length()); 
                        if(!dtmp.find("/") || dtmp.empty()) {
                        /* find "/" at 0, means not other dir that name start with "path" */
                            fprintf(stderr, "\e[1;31m\e[4m rename [%s] ", dit->first.c_str());
                            dtmp = to + dtmp;
                            fprintf(stderr, "to [%s]\e[m\n", dtmp.c_str());
                            dir_node dn(new dir_node_n(dtmp));
                            dir_map_.insert(std::make_pair(dtmp, dn));
                            dir_map_.erase(dit);
                        }
                    }
                }
                return true; 
            }
        }else {
            map_.insert(std::make_pair(to, it->second));
            map_.erase(it);
            return true;
        }
    }

解决方案 »

  1.   

    我对这个理解不够透彻,表述可能不太清楚我以为只要系统调用读取文件信息的函数(getattr,readdir,opendir)时候,我告诉它这个文件是存在的,并且给他这个文件让他读就好了,可是实际上我即使告诉系统这个文件存在,并且已经是改名后的文件夹下的文件了,系统好像还是认为这个文件是关联在原来文件夹下的,于是在改名后的文件夹里就看不到它