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;
}
}
uj5u.com熱心網友回復:
我對這個理解不夠透徹,表述可能不太清楚我以為只要系統呼叫讀取檔案資訊的函式(getattr,readdir,opendir)時候,我告訴它這個檔案是存在的,并且給他這個檔案讓他讀就好了,可是實際上我即使告訴系統這個檔案存在,并且已經是改名后的檔案夾下的檔案了,系統好像還是認為這個檔案是關聯在原來檔案夾下的,于是在改名后的檔案夾里就看不到它
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/99059.html
標籤:內核源代碼研究區
上一篇:manjaro怎么關閉自動掛起
