int RemoveDirentry(InodeInfo* inodeInfo, char* dirname) { /* * precondition : inodeInfo != NULL, dirname != NULL * postcondition : dirname은 삭제를 원하는 디렉토리명이며, * inodeInfo는 dirname을 가지고 있을 것으로 추정되는 inode이다. * 성공시 0, 실패시 -1 리턴 */ int block = 0, index = 0; int parent_inodeno = 0; int current_inodeno = 0; int ret_value = 0; int i = 0; InodeInfo delInodeInfo; InodeInfo nullinode; DirBlock dirBlock; DirBlock nullblock; memset(&nullinode, 0, sizeof(InodeInfo)); memset(&nullblock, 0, sizeof(DirBlock)); ReadDirBlock(&dirBlock, inodeInfo->i_block[0]); current_inodeno = dirBlock.dirEntries[0].inodeNum; parent_inodeno = dirBlock.dirEntries[1].inodeNum; for ( block = 0 ; block < inodeInfo->blocks ; block++ ) { ReadDirBlock(&dirBlock, inodeInfo->i_block[block]); for ( index = 0 ; index < MAX_INDEX_OF_DIRBLK ; index++ ) { if(strcmp(dirBlock.dirEntries[index].name, dirname) == 0 && dirBlock.dirEntries[index].type == FILE_TYPE_DIR) {// 지울 디렉토리명을 찾으면 ReadInode(&delInodeInfo, dirBlock.dirEntries[index].inodeNum); if ( (ret_value = DirIsEmpty(&delInodeInfo)) == WRONG_VALUE ) { fprintf(stderr, "dirname is not a DIRECTORY!\n"); fprintf(stderr, "DirIsEmpty() Error!\n"); } if ( ret_value == TRUE ) {// 디렉토리가 비어있다. ==> 삭제 for ( i = 0 ; i < delInodeInfo.blocks ; i++ ) { WriteDirBlock(&nullblock, delInodeInfo.i_block[i]); SetBlockAllocToFree(delInodeInfo.i_block[i]); } WriteInode(&nullinode, dirBlock.dirEntries[index].inodeNum); SetInodeAllocToFree(dirBlock.dirEntries[index].inodeNum); dirBlock.dirEntries[index].inodeNum = 0; strcpy(dirBlock.dirEntries[index].name, ""); // DirBlock과 InodeInfo 갱신하기 WriteDirBlock(&dirBlock, inodeInfo->i_block[block]); return 0; } } } } return -1; }
/********************************************************************************************************* ** 函数名称: RemoveDir ** 功能描述: 删除目录 ** ** 输 入: Path:路径名 ** ** 输 出: RETURN_OK:成功 ** 其它参考fat.h中关于返回值的说明 ** 全局变量: 无 ** 调用模块: strupr,DelFDT ********************************************************************************************************/ acoral_u8 RemoveDir(acoral_char *Path) { acoral_u32 ClusIndex, ClusIndex1; acoral_u8 Drive, Rt; acoral_char DirName[12]; FDT temp; strupr(Path); /* 变为大写 */ ClusIndex = _GetFDTInfo(DirName, Path); if (ClusIndex == BAD_CLUS) { return PATH_NOT_FIND; } Drive = GetDrive(Path); /* 获取FDT其信息 */ Rt = FindFDTInfo(&temp, Drive, ClusIndex, DirName); if (Rt == RETURN_OK) { /* 是否是目录 */ if ((temp.Attr & ATTR_DIRECTORY) != 0) { /* 是 */ ClusIndex1 = temp.FstClusLO + ((acoral_u32)(temp.FstClusHI) << 16); /* 是否是空目录 */ Rt = DirIsEmpty(Drive, ClusIndex1); if (Rt == DIR_EMPTY) { /* 是,删除 */ FATDelClusChain(Drive, ClusIndex1); Rt = DelFDT(Drive, ClusIndex, DirName); } } else { return PATH_NOT_FIND; } } return Rt; }