📄 dir.c
字号:
if (Path[0] == '.') /* '\.'表明起点是当前路径 */
{
Rt = Disk->PathClusIndex;
if (Path[1] == 0 || Path[1] == '\\')
{
Path++;
}
}
if (Path[0] == '\\')
{
Path++;
}
DirName[11] = 0;
while (Path[0] != 0)
{
/* 获取子目录名 */
StrToFDTName(DirName , Path);
/* 子目录名开始簇号 */
if (DirName[0] == 0x20)
{
Rt = BAD_CLUS;
break;
}
/* 获取FDT信息 */
if (FindFDTInfo(&temp, Drive, Rt, DirName) != RETURN_OK)
{
Rt = BAD_CLUS;
break;
}
/* FDT是否是目录 */
if ((temp.Attr & ATTR_DIRECTORY) == 0)
{
Rt = BAD_CLUS;
break;
}
Rt = temp.FstClusLO + ((uint32)(temp.FstClusHI) << 16);
/* 字符串到下一个目录 */
while (1)
{
if (*Path == '\\')
{
Path++;
break;
}
if (*Path == 0)
{
break;
}
Path++;
}
}
}
if (Disk->FATType == FAT32)
if (Rt != BAD_CLUS)
if (Rt == Disk->RootDirTable)
{
Rt = 0;
}
}
return Rt;
}
/*********************************************************************************************************
** 函数名称: MakeDir
** 功能描述: 建立目录
**
** 输 入: Path:路径名
**
** 输 出: RETURN_OK:成功
** 其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: strupr,ClearClus,AddFDT
**
** 作 者: 陈明计
** 日 期: 2003年9月8日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年4月10日
**------------------------------------------------------------------------------------------------------
** 修改人: 严寒亮
** 日 期: 2004年11月5日
** 说 明: 增加文件夹建立时的"建立时间"属性
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 MakeDir(char *Path)
{
uint32 ClusIndex, Temp1;
uint8 Drive, Rt;
FDT temp;
SYS_TIME CurTime;
Path = FsStrCopy(Path);
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); /* 清空簇 */
if(FS_GetDateTime(&CurTime) != RETURN_OK) // 获取当前时间
{
return GET_TIME_ERR;
}
/* 设置FDT属性 */
temp.Attr = ATTR_DIRECTORY; // FDT属性为文件夹
temp.FileSize = 0; // 大小为0
temp.NTRes = 0;
/*-------在此加入创建时间的程序---------*/
temp.CrtTimeTenth = CurTime.msec;
temp.CrtTime = CurTime.time;
temp.CrtDate = CurTime.date;
temp.LstAccDate = CurTime.date;
temp.WrtTime = CurTime.time + 1; // 修改时间需要加2秒,因为它不能计算到毫秒戳
temp.WrtDate = CurTime.date;
/*--------------------------------------*/
temp.FstClusLO = Temp1 & 0xffff; // 簇链第一簇的低16位
temp.FstClusHI = Temp1 / 0x10000; // 高16位
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;
}
/*********************************************************************************************************
** 函数名称: RemoveDir
** 功能描述: 删除目录
**
** 输 入: Path:路径名
**
** 输 出: RETURN_OK:成功
** 其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: strupr,DelFDT
**
** 作 者: 陈明计
** 日 期: 2003年9月8日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年4月10日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 RemoveDir(char *Path)
{
uint32 ClusIndex, ClusIndex1;
uint8 Drive, Rt;
char DirName[12];
FDT temp;
Path = FsStrCopy(Path);
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 + ((uint32)(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;
}
/*********************************************************************************************************
** 函数名称: ChangeDir
** 功能描述: 改变当前目录
**
** 输 入: Path:路径名
**
** 输 出: RETURN_OK:成功
** 其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDirClusIndex,GetDiskInfo
**
** 作 者: 陈明计
** 日 期: 2003年9月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ChangeDir(char *Path)
{
uint32 ClusIndex;
uint8 Rt, Drive;
Disk_Info *Disk;
Rt = PATH_NOT_FIND;
ClusIndex = GetDirClusIndex(Path);
if (ClusIndex != BAD_CLUS)
{
Drive = GetDrive(Path);
Disk = GetDiskInfo(Drive);
Rt = NOT_FIND_DISK;
if (Disk != NULL)
{
Rt = RETURN_OK;
Disk->PathClusIndex = ClusIndex;
}
}
return Rt;
}
/*********************************************************************************************************
** 函数名称: mount
** 功能描述: 加载卷(已分配盘符),允许读写。
**
** 输 入: DriveName:包含逻辑盘的字符串
**
** 输 出: RETURN_OK:成功
** 其它参考fat.h中关于返回值的说明
**
** 作 者: 陈明计
** 日 期: 2004年12月31日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 mount(char *DriveName)
{
uint8 Drive, Rt;
uint8 *Buf;
Disk_Info *Disk;
extern uint8 FsMount(Disk_Info *DiskInfo, uint8 *Buf);
extern Disk_Info * GetDiskInfo2(uint8 Drive);
DriveName = FsStrCopy(DriveName);
Drive = GetDrive(DriveName);
Disk = GetDiskInfo2(Drive); /* 获取逻辑盘信息 */
if (Disk == NULL)
{
return NOT_FIND_DISK;
}
Buf = OpenSec(Drive, 0);
if (Buf == NULL)
{
return NOT_EMPTY_CACHE;
}
/* 读取扇区数据 */
Rt = ReadSec(Drive, 0);
if (Rt != RETURN_OK)
{
return Rt;
}
Rt = FsMount(Disk, Buf);
CloseSec(Drive, 0);
return Rt;
}
/*********************************************************************************************************
** 函数名称: umount
** 功能描述: 卸载卷(已分配盘符),禁止读写。
**
** 输 入: DriveName:包含逻辑盘的字符串
**
** 输 出: RETURN_OK:成功
** 其它参考fat.h中关于返回值的说明
**
** 作 者: 陈明计
** 日 期: 2004年12月31日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 umount(char *DriveName)
{
uint8 Drive;
extern uint8 FsUMount(uint8 Drive);
DriveName = FsStrCopy(DriveName);
Drive = GetDrive(DriveName);
return FsUMount(Drive);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -