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)); } }
FileHandler VirtualDiskNode::openFile(MyString path) { if (!isNormalizedPath(path)) { assert(0); return FileHandler(nullptr); } path = path.toLower(); MyString dir_path = dirname(path); DirNode* parent = getDirNode(dir_path); if (!parent) return FileHandler(nullptr); MyString file_name = basename(path); // 文件至少被存放在根目录之下 if (file_name.isEmpty()) { return FileHandler(nullptr); } int file = parent->findFile(file_name); if (file == -1) { return FileHandler(nullptr); } else { return FileHandler(parent->getFileRef(file)); } }
bool VirtualDiskNode::isFile(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); int file = parent->findFile(name); return file != -1; }
void CommandDir::exec(VirtualDiskNode* vfs) { if (!vfs) { assert(0); return; } if (m_pathes.isEmpty()) { m_pathes.append(vfs->pwd()); } for (int i = 0; i < m_pathes.size(); ++i) { MyString path = m_pathes[i]; if (!isNormalizedPath(path)) { path = vfs->pathNormalize(path); } path = path.toLower(); if (!vfs->isExist(path)) { throw CommandException(_T("系统找不到指定路径\n")); } if (vfs->isFile(path)) { FileHandler file_handler = vfs->openFile(path); state s = file_handler.stat(); displayState(s, false); _tprintf(_T("%15d 个文件%14d 字节\n"), 1, s.size); _tprintf(_T("%15d 个目录\n"), 0); } if (vfs->isDir(path)) { if (m_recursive) { listDirRecursive(path, vfs, m_only_dir); } else { listDir(path, vfs, m_only_dir); } } } return; }
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; }
void VirtualDiskNode::deleteFile(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 file_name = basename(path); assert(!file_name.isEmpty()); int file = parent->findFile(file_name); if (file != -1) { parent->removeFile(file); } return; }
FileHandler VirtualDiskNode::createFile(MyString path) { if (!isNormalizedPath(path)) { assert(0); return FileHandler(nullptr); } MyString dir_path = dirname(path).toLower(); DirNode* parent = getDirNode(dir_path); if (!parent) return FileHandler(nullptr); // 文件名创建时保留大小写 MyString file_name = basename(path); if (parent->findFile(file_name) != -1) { return FileHandler(nullptr); } FileNode* nfile = parent->addFile(); assert(nfile); nfile->set_name(file_name); nfile->set_path(path.toLower()); return FileHandler(nfile); }
SmartPtr<CommandInterface> CommandFactory::create(const MyString& command) { MyString name; Vector<MyString> pathes; Vector<MyString> switches; int flag = parse(command, &name, &pathes, &switches); if (name.isEmpty()) { if (pathes.size() == 1 && _istalpha(pathes[0][0]) && pathes[0][1] == _T(':')) { name = _T("change_volumn"); } if (flag == -1) { throw CommandException(_T("无法识别的命令\n")); } } name = name.toLower(); for (int i = 0; i < switches.size(); ++i) { switches[i] = switches[i].toLower(); } SmartPtr<CommandInterface> ret; if (name == _T("prompt")) { ret = SmartPtr<CommandInterface>(new CommandPrompt); } else if (name == _T("change_volumn")) { ret = SmartPtr<CommandInterface>(new CommandChangeVolumn); } else if (name == _T("cd")) { ret = SmartPtr<CommandInterface>(new CommandCd); } else if (name == _T("dir")) { ret = SmartPtr<CommandInterface>(new CommandDir); } else if (name == _T("mkdir")) { ret = SmartPtr<CommandInterface>(new CommandMkdir); } else if (name == _T("rmdir")) { ret = SmartPtr<CommandInterface>(new CommandRmdir); } else if (name == _T("copy")) { ret = SmartPtr<CommandInterface>(new CommandCopy); } else if (name == _T("del")) { ret = SmartPtr<CommandInterface>(new CommandDel); } else if (name == _T("compare")) { ret = SmartPtr<CommandInterface>(new CommandCompare); } else { throw CommandException(_T("无法识别的命令\n")); } ret->setPathes(pathes); ret->setSwitches(switches); return ret; }