Ejemplo n.º 1
0
DirHandler VirtualDiskNode::createDir(MyString path)
{
    if (!isNormalizedPath(path))
    {
        assert(0);
        return DirHandler(nullptr);
    }
    MyString dir_path = dirname(path).toLower();
    DirNode* parent = getDirNode(dir_path);
    if (!parent)
        return DirHandler(nullptr);

    MyString dir_name = basename(path);
    if (dir_name == _T("..") || dir_name == _T("."))
        return DirHandler(nullptr);
    if (parent->findSubDir(dir_name.toLower()) != -1)
        return DirHandler(nullptr);

    DirNode* ndir = parent->addSubDir();
    assert(ndir);
    ndir->set_name(dir_name);
    ndir->set_path(path);
    // 新建文件夹中,包含“.”,“..”两个文件夹。
    DirNode* n_self = ndir->addSubDir();
    n_self->set_name(_T("."));
    n_self->set_path(dir_path + _T("\\."));
    DirNode* n_parent = ndir->addSubDir();
    n_parent->set_name(_T(".."));
    n_parent->set_path(dir_path + _T("\\.."));
    n_parent->set_ctime(parent->get_ctime());
    return DirHandler(ndir);
}
Ejemplo n.º 2
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));
    }
}
Ejemplo n.º 3
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;
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
0
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;
}