/********************************************************************************************************* ** 函数名称: MakeDir ** 功能描述: 建立目录 ** ** 输 入: Path:路径名 ** ** 输 出: RETURN_OK:成功 ** 其它参考fat.h中关于返回值的说明 ** 全局变量: 无 ** 调用模块: strupr,ClearClus,AddFDT ********************************************************************************************************/ acoral_u8 MakeDir(acoral_char *Path) { acoral_u32 ClusIndex, Temp1; acoral_u8 Drive, Rt; FDT temp; strupr(Path); /* 变为大写 */ ClusIndex = _GetFDTInfo(temp.Name, Path); if (ClusIndex == BAD_CLUS) { return PATH_NOT_FIND; } Drive = GetDrive(Path); /* FDT是否存在 */ Rt = FDTIsLie(Drive, ClusIndex, temp.Name); if (Rt != NOT_FIND_FDT) { return Rt; } /* 不存在 */ Temp1 = FATAddClus(Drive, 0); /* 获取目录所需磁盘空间 */ if ((Temp1 <= EMPTY_CLUS_1) || (Temp1 >= BAD_CLUS)) { /* 没有空闲空间 */ return DISK_FULL; } ClearClus(Drive, Temp1); /* 清空簇 */ /* 设置FDT属性 */ temp.Attr = ATTR_DIRECTORY; temp.FileSize = 0; temp.NTRes = 0; temp.CrtTimeTenth = 0; temp.CrtTime = 0; temp.CrtDate = 0; temp.LstAccDate = 0; temp.WrtTime = 0; temp.WrtDate = 0; temp.FstClusLO = Temp1 & 0xffff; temp.FstClusHI = Temp1 / 0x10000; Rt = AddFDT(Drive, ClusIndex, &temp); /* 增加目录项 */ if (Rt == RETURN_OK) { /* 建立'.'目录 */ temp.Name[0] = '.'; temp.Name[1] = 0x20; temp.Name[2] = 0x20; temp.Name[3] = 0x20; temp.Name[4] = 0x20; temp.Name[5] = 0x20; temp.Name[6] = 0x20; temp.Name[7] = 0x20; temp.Name[8] = 0x20; temp.Name[9] = 0x20; temp.Name[10] = 0x20; AddFDT(Drive, Temp1, &temp); /* 建立'..'目录 */ temp.Name[1] = '.'; temp.FstClusLO = ClusIndex & 0xffff; temp.FstClusHI = ClusIndex / 0x10000; Rt = AddFDT(Drive, Temp1, &temp); } else { FATDelClusChain(Drive, Temp1); } return Rt; }
/********************************************************************************************************* ** Name :MakeDir ** Description :create direction ** Input :Path: DirFileName the path name use the 8.3 format. ** Output :RETURN_OK:成功 ** other reference the return value explain in file fat.h ** global :FileInfo ** call module :AddFDT, GetDirClusIndex ********************************************************************************************************/ IRAM_ENCODE uint8 MakeDir(uint8 *Path, uint8 *DirFileName) { uint8 Rt; uint8 i; uint32 ClusIndex, Temp1; FDT temp; StrUprCase(Path); ClusIndex = GetDirClusIndex(Path); Rt = PATH_NOT_FIND; if (ClusIndex != BAD_CLUS) { for (i = 0; i < 11; i++) //目录项填空格 { temp.Name[i] = ' '; } for (i = 0; i < 11; i++) { if (*DirFileName == '\0') //到路径结束 { break; } temp.Name[i] = *DirFileName++; } /* FDT是否存在 */ Rt = FDTIsLie(ClusIndex, temp.Name); if (Rt == NOT_FIND_FDT) { /* 不存在 */ Temp1 = FATAddClus(0); /* 获取目录所需磁盘空间 */ Rt = DISK_FULL; /* 没有空闲空间 */ if ((Temp1 > EMPTY_CLUS_1) && (Temp1 < BAD_CLUS)) { ClearClus(Temp1); /* 清空簇 */ /* 设置FDT属性 */ temp.Attr = ATTR_DIRECTORY; temp.FileSize = 0; temp.NTRes = 0; temp.CrtTimeTenth = 0; temp.CrtTime = 0; temp.CrtDate = 0; temp.LstAccDate = 0; temp.WrtTime = 0; temp.WrtDate = 0; temp.FstClusLO = Temp1 & 0xffff; temp.FstClusHI = Temp1 / 0x10000; Rt = AddFDT(ClusIndex, &temp); /* 增加目录项 */ if (Rt == RETURN_OK) { /* 建立'.'目录 */ temp.Name[0] = '.'; for (i = 1; i < 11; i++) { temp.Name[i] = ' '; } AddFDT(Temp1, &temp); /* 建立'..'目录 */ temp.Name[1] = '.'; if (ClusIndex == BootSector.BPB_RootClus) { ClusIndex = 0; } temp.FstClusLO = ClusIndex & 0xffff; temp.FstClusHI = ClusIndex / 0x10000; Rt = AddFDT(Temp1, &temp); } else { FATDelClusChain(Temp1); } Rt = RETURN_OK; } } } /////////////////////////////////////////////////////////// //回写FAT Cache if (gFatCache.Sec!=0 && gFatCache.Flag!=0) { gFatCache.Flag=0; FATWriteSector(gFatCache.Sec, gFatCache.Buf); } /////////////////////////////////////////////////////////// return (Rt); }