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