DirHandler VirtualDiskNode::createDir(MyString path) { if (!isNormalizedPath(path)) { assert(0); return DirHandler(nullptr); } MyString dir_path = dirname(path).toLower(); DirNode* parent = getDirNode(dir_path); if (!parent) return DirHandler(nullptr); MyString dir_name = basename(path); if (dir_name == _T("..") || dir_name == _T(".")) return DirHandler(nullptr); if (parent->findSubDir(dir_name.toLower()) != -1) return DirHandler(nullptr); DirNode* ndir = parent->addSubDir(); assert(ndir); ndir->set_name(dir_name); ndir->set_path(path); // 新建文件夹中,包含“.”,“..”两个文件夹。 DirNode* n_self = ndir->addSubDir(); n_self->set_name(_T(".")); n_self->set_path(dir_path + _T("\\.")); DirNode* n_parent = ndir->addSubDir(); n_parent->set_name(_T("..")); n_parent->set_path(dir_path + _T("\\..")); n_parent->set_ctime(parent->get_ctime()); return DirHandler(ndir); }
DirHandler VirtualDiskNode::openDir(MyString path) { if (!isNormalizedPath(path)) { assert(0); return DirHandler(nullptr); } path = path.toLower(); MyString dir_path = dirname(path); DirNode* parent = getDirNode(dir_path); if (!parent) return DirHandler(nullptr); MyString dir_name = basename(path); // 访问根目录, “空”文件夹的情况 if (dir_name.isEmpty() || dir_name == _T("..") || dir_name == _T(".")) { return DirHandler(parent); } int dir = parent->findSubDir(dir_name); if (dir == -1) { return DirHandler(nullptr); } else { return DirHandler(parent->getSubDirRef(dir)); } }
bool VirtualDiskNode::isDir(MyString path) const { if (!isNormalizedPath(path)) { assert(0); return false; } path = path.toLower(); MyString dir_path = dirname(path); DirNode* parent = const_cast<VirtualDiskNode*>(this)->getDirNode(dir_path); if (!parent) return false; MyString name = basename(path); if (name.isEmpty()) return true; int dir = parent->findSubDir(name); return dir != -1; }
void VirtualDiskNode::deleteDir(MyString path) { if (!isNormalizedPath(path)) { assert(0); return; } path = path.toLower(); MyString dir_path = dirname(path); DirNode* parent = getDirNode(dir_path); if (!parent) return; MyString dir_name = basename(path); assert(!dir_name.isEmpty()); int dir = parent->findSubDir(dir_name); if (dir != -1) { parent->removeSubDir(dir); } return; }
DirNode* VirtualDiskNode::getDirNode(const MyString& path) { assert(isNormalizedPath(path)); Vector<MyString> dirnames = split(path); DirNode* ret = &m_root; if (dirnames[0] != ret->get_name().toLower() || ret->get_type() == FILE_TYPE) return nullptr; for (int i = 1; i < dirnames.size(); ++i) { int subdir = ret->findSubDir(dirnames[i]); if (subdir == -1) { return nullptr; } else { ret = ret->getSubDirRef(subdir); } } return ret; }