void FsDirectoryImpl::createFile(const std::string& filename, int maxChunkSize, short replication) { Path path(filename); DirNode* pDirNode; if (path.isPureDir()){ LOG4CPLUS_WARN(m_logger, "the filename is pure dir :" << filename); throw InvalidFileOrDirName("the filename is pure dir"); } if( (pDirNode = m_pDirTree->createDirNodes(path.getDirName())) ) { if (pDirNode->findFile(path.getFileName())){ LOG4CPLUS_WARN(m_logger, "file already exist :" << path.getFileName()); throw FileOrDirAlreadyExists("file already exist error"); } INode inode(path.getFileName(), replication, maxChunkSize); //->addFile should have bool return value pDirNode->addFile(inode); } else{ LOG4CPLUS_WARN(m_logger, "the path name is invalid : " << path.getDirName()); throw InvalidFileOrDirName("the path name is invalid"); } }
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)); } }
void FsDirectoryImpl::deleteFile(const std::string& filename, Chunks& deletedChunks) { Path path(filename); DirNode* pDirNode; INode* pINode; //preconditions check if (path.isPureDir() ){ LOG4CPLUS_WARN(m_logger, "deleteFile, but filename is a pure dir " << filename); throw InvalidFileOrDirName("deleteFile : is pure dir"); } //#TODO, lock pDirNode = m_pDirTree->findDirNode(path.getDirName()); if(!pDirNode) { LOG4CPLUS_WARN(m_logger, "directory not exist :" << path.getDirName()); throw NoSuchFileOrDir("deleteFile : directory"); } if (!(pINode = pDirNode->findFile(path.getFileName()))){ LOG4CPLUS_WARN(m_logger, "file not exist : " << path.getFileName()); throw NoSuchFileOrDir("deleteFile : filename"); } Chunks chunks = pINode->getChunks(); deletedChunks.assign(chunks.begin(), chunks.end()); //#BUGFIX, [#13] INode:findChunk segment fatal error //ChunkTable not synchronized with deleteFile // for( int i = 0; i < chunks.size() ; i++){ m_pChunkTable->deleteItem(chunks[i].id); } //#BUGFIX, [#17] INode:findChunk segment fatal error //NewChunkTable not synchronized with deleteFile // vector<Long> deleteNewChunkIds; if(m_pNewChunkTable->deleteItem(pINode, deleteNewChunkIds)){ string chunkIdList; for (int i = 0 ; i < deleteNewChunkIds.size(); i++){ chunkIdList += deleteNewChunkIds[i]; chunkIdList += " "; } LOG4CPLUS_WARN(m_logger, "delete newchunks not committed: " << chunkIdList); } pDirNode->deleteFile(path.getFileName()); }
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; }
bool FsDirectoryImpl::exists(const std::string &name) { Path path(name); DirNode* pDirNode; if ( path.isPureDir() ) { //pure directory name pDirNode = m_pDirTree->findDirNode(name); return (pDirNode != NULL); } else{ //contains file name pDirNode = m_pDirTree->findDirNode(path.getDirName()); if(!pDirNode) return false; return (NULL != pDirNode->findFile(path.getFileName())); } }
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; }
INode* DirTree::findINode(const std::string &name) const { DirNode *pNode; INode *pInode; Path path(name); if ( (pNode = findDirNode(name)) ) { if (path.isPureDir()) { return pNode->getINode(); } else { //try file node first pInode = pNode->findFile(path.getFileName()); if(pInode) return pInode; //try dir node then DirNode *pDirNode = pNode->findChild(path.getFileName()); if(pDirNode) return pDirNode->getINode(); else return NULL; } } return NULL; }
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); }