⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dir.c

📁 arm7 zlg lpc2219 bootloader
💻 C
📖 第 1 页 / 共 2 页
字号:
            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 + -