/********************************************************************************************************* ** 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); }
/********************************************************************************************************* ** 函数名称: 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; }
/****************************************************************************** ** 函数名称: _FileOpenW ** 功能描述: 只写方式打开文件,内部使用 ** ** 输 入: DirFileName:用户使用的文件名 ** ** 输 出: 文件句柄,Not_Open_FILE为不能打开 ** ** 全局变量: FileInfo ** 调用模块: _GetFDTInfo,FindFDTInfo ** *****************************************************************************/ HANDLE _FileOpenW(Int8 *DirFileName) { MY_FILE *fp; FDT temp; HANDLE Rt; Uint8 i; SYS_TIME CurTime,CrtTime; // 保存当前时间日期 /* 查找空闲文件登记项 */ for (Rt = 0; FileInfo[Rt].Flags; Rt++) { if(Rt >= MAX_OPEN_FILES) return Not_Open_FILE; } fp = FileInfo + Rt; // 指向获得的空闲登记项 /* 获取目录开始簇号和文件名 */ fp->DirClus = _GetFDTInfo(fp->Name, DirFileName); // 获取该文件的FDT项的首簇号,及文件名 if (fp->DirClus < BAD_CLUS) { /* 文件已经以读写方式打开,不能再次以读写方式打开 */ if (FindOpenFile(fp->DirClus, fp->Name, FILE_FLAGS_WRITE) == Not_Open_FILE) { if(FS_GetDateTime(&CurTime) != RETURN_OK) // 获取当前系统时间 { return GET_TIME_ERR; } if (FindFDTInfo(&temp, fp->DirClus, fp->Name) == RETURN_OK) { if ((temp.Attr & ATTR_DIRECTORY) != 0) { return Not_Open_FILE; // 如果该文件为目录,则不能删除 } CrtTime.date = temp.CrtDate; // 保存文件建立时间 CrtTime.time = temp.CrtTime; CrtTime.msec = temp.CrtTimeTenth; if (RemoveFile(DirFileName) != RETURN_OK) /* 删除文件 */ { return Not_Open_FILE; } } else { CrtTime = CurTime; // 设置文件建立时间为当前时间 } /* 创建文件 */ for (i = 0; i < 11; i++) // 创建将要生成文件的FDT项 { temp.Name[i] = fp->Name[i]; // 复制名字 } temp.Attr = 0; // 特性为0 temp.FileSize = 0; temp.NTRes = 0; /*-------在此加入创建时间的程序---------*/ temp.CrtTimeTenth = CrtTime.msec; temp.CrtTime = CrtTime.time; temp.CrtDate = CrtTime.date; temp.LstAccDate = CurTime.date; temp.WrtTime = CurTime.time + 1; temp.WrtDate = CurTime.date; /*--------------------------------------*/ temp.FstClusLO = 0; temp.FstClusHI = 0; if (AddFDT(fp->DirClus, &temp) == RETURN_OK) /* 增加文件 */ { /* 设置文件信息 */ fp->Flags = FILE_FLAGS_WRITE; fp->FileSize = 0; fp->FstClus = 0; fp->Clus = 0; fp->Offset = 0; return Rt; } // if(Add..) } // if(Find..) } // if(fp..) return Not_Open_FILE; }