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; }
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); } } } }
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); }