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