void CommandCd::exec(VirtualDiskNode* vfs) { if (!vfs) { assert(0); return; } if (m_path.isEmpty()) { MyString pwd = vfs->pwd(); if (!pwd.endWith(_T("\\"))) { pwd += _T("\\"); } _tprintf(_T("%s\n"), pwd.c_str()); return; } if (!isNormalizedPath(m_path)) { m_path = vfs->pathNormalize(m_path); } m_path = m_path.toLower(); if (!m_path.startWith(_T("c:"))) { throw CommandException(_T("系统找不到指定的驱动器\n")); } if (!vfs->isDir(m_path)) { throw CommandException(_T("系统找不到指定的目录\n")); } vfs->chdir(m_path); return; }
bool isNormalizedPath(MyString path) { if (isVolumnRelative(path) || isRelative(path)) { return false; } else if (isAbs(path) && !path.endWith(_T("\\"))) { return true; } return false; }
bool isNormalizedPath(MyString path) { if (isRelative(path)) { return false; } else if (isAbs(path) && !path.endWith(_T("\\")) && (path.startWith(_T("c:")) || path.startWith(_T("C:")))) { return true; } return false; }
// 不改变路径中的大小写情况 MyString VirtualDiskNode::pathNormalize(MyString path) const { MyString ret; if (!isPath(path)) { assert(0); return ret; } if (isVolumnRelative(path)) { ret = join(m_pwd.substr(0, 2), path); } else if (isRelative(path)) { if (path == _T(".")) { ret = m_pwd; } else if (path == _T("..")) { ret = dirname(m_pwd); } else if (path.startWith(_T("..\\"))) { ret = dirname(m_pwd) + path.substr(2); } else if (path.startWith(_T(".\\"))) { ret = m_pwd + path.substr(1); } // 直接输入名字的情况 else if (!match(path, _T("?:*"))) { ret = m_pwd + _T("\\") + path; } } // 绝对路径中处理:\dir\file的情况 //else if (path.startWith(_T("\\"))) //{ // ret = _T("c:") + path; //} if (path.endWith(_T("\\"))) { ret = ret.substr(0, ret.size() - 1); } return ret; }