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; }
MyString join(MyString path, MyString name) { if (path[path.size() - 1] != _T('\\') && !name.isEmpty() && !name.startWith(_T("\\"))) { path += _T("\\"); } path += name; return path; }
bool isLegalName(MyString name) { for (int i = 0; i < name.size(); ++i) { if (!isLegalChar(name[i])) return false; } if (name.startWith(_T(" ")) || name.size() > g_MAX_NAME_SIZE) return false; return true; }
// C:\ // \name bool isAbs(MyString path) { /*文件名需要忽略大小写 */ if (path.startWith(_T("\\"))) { return true; } else if (match(path, _T("?:*")) && _istalpha(path[0])) { return true; } return false; }
// test second // . // .. // .\ // ..\ // name bool isRelative(MyString path) { if (path.isEmpty()) { return false; } if (path.startWith(_T("."))) { return true; } else if (path.startWith(_T("\\"))) { return true; } else { int pos = path.find(_T('\\')); MyString head = path.substr(0, pos); if (!head.isEmpty() && isLegalName(head)) return true; } return false; }
// test first // \name bool isVolumnRelative(MyString path) { if (path.startWith(_T("\\"))) return true; return false; }