Exemplo n.º 1
0
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));
    }
}
Exemplo n.º 2
0
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));
    }
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}
Exemplo n.º 7
0
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;
}
Exemplo n.º 8
0
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);
}
Exemplo n.º 9
0
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;
}