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)); } }
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; }