示例#1
0
FilesInfoPtr FsDirectoryImpl::readDir(const std::string& dirname) //const
{
    FilesInfoPtr pFilesInfo(new FilesInfo());
    FileInfo info;
    //#BUGFIX #item 5, ls /root/test/dd error
    Path path(dirname + "/");
    DirNode* pDirNode;

    //#NOTICE, findDirNode() must give a path name with "/" tailed.
    pDirNode = m_pDirTree->findDirNode(path.getDirName());    
    
    if(!pDirNode){
        LOG4CPLUS_WARN(m_logger, "direcoty not exist" << path.getDirName());
        throw NoSuchFileOrDir("readDir : dirname");
    }

    //iterate through all child dirs
    for ( DirNodeIterator iter =  pDirNode->getChildrenBegin();
        iter != pDirNode->getChildrenEnd(); ++iter){  
        (*iter)->getINode()->makeFileInfo(info);
        pFilesInfo->push_back(info);
    }

    //iterate through all files in this dir
    for ( INodeIterator iter =  pDirNode->getFilesBegin();
        iter != pDirNode->getFilesEnd(); ++iter){  
        (*iter)->makeFileInfo(info);
        pFilesInfo->push_back(info);
    }

    return pFilesInfo;
}
示例#2
0
void FsDirectoryImpl::rebuildRuntimeData()
{
    //rebuild ChunkTable by walk through the tree
    DirNode* pDirNode = m_pDirTree->getRoot();
    deque<DirNode*> waitQueue;
    
    //waitQueue.
    waitQueue.push_back(pDirNode);

    while(waitQueue.size()!=0){
        pDirNode = waitQueue[0];
        waitQueue.pop_front();

        //add children node into queue
        tfs::DirNodeIterator iter;
        for ( iter = pDirNode->getChildrenBegin(); iter != pDirNode->getChildrenEnd(); ++iter) {
            waitQueue.push_back(*iter);
        }

        //deal with this node
        tfs::DirNodeIterator dirNodeIter;
        tfs::INodeIterator inodeIter;
        tfs::ChunkIterator chunkIter;

        for ( inodeIter = pDirNode->getFilesBegin(); inodeIter != pDirNode->getFilesEnd() ; ++inodeIter) {
            for ( chunkIter = (*inodeIter)->getChunksBegin(); chunkIter != (*inodeIter)->getChunksEnd(); ++chunkIter) {
                m_pChunkTable->addItem((*chunkIter).id, *inodeIter);
            }
        }
    }

}
示例#3
0
void FsDirectoryImpl::deleteDir(const std::string& dirName)
{
    Path path(dirName+"/");
    DirNode* pDirNode;

    //#TODO, lock

    pDirNode = m_pDirTree->findDirNode(path.getDirName());

    if(!pDirNode) {
        LOG4CPLUS_WARN(m_logger, "directory not exist : " << path.getDirName());
        throw NoSuchFileOrDir("deleteDir:");
    }
    else if(pDirNode == m_pDirTree->getRoot()){
        //don't delete root node
        LOG4CPLUS_WARN(m_logger, "deleting ROOT directory canceled");
        throw InvalidFileOrDirName("deleteDir: ROOT directory can't be deleted"); 
    }

    //check empty directory
    INodeIterator iter = pDirNode->getFilesBegin();
    if( iter != pDirNode->getFilesEnd()) {
        LOG4CPLUS_WARN(m_logger, "directory not empty");
        throw InvalidFileOrDirName("deleteDir: dir not empty"); 
    }
    DirNodeIterator iterDir = pDirNode->getChildrenBegin();
    if( iterDir != pDirNode->getChildrenEnd()) {
        LOG4CPLUS_WARN(m_logger, "directory not empty");
        throw InvalidFileOrDirName("deleteDir: dir not empty"); 
    }

    pDirNode->getParent()->deleteChild(pDirNode);
    
}