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

📄 dir.c

📁 arm7 zlg lpc2219 bootloader
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        ARM开发组
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: dir.c
**创   建   人: 陈明计
**最后修改日期:  2003年9月9日
**描        述: FAT文件系统的目录基本操作程序
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.0
** 日 期: 2003年9月8日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年4月10日
** 描 述: 增加注释
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_DIR
#include "config.h"

uint8 CurrentDrive;

static char FsPathFileName[MAX_PATHFILE_LENGTHS + 1];

uint32 GetDirClusIndex(char *Path);

/*********************************************************************************************************
** 函数名称: FsStrCopy
** 功能描述: 把字符串拷贝内部缓存
**
** 输 入: source:字符串
**        
** 输 出: 内部缓存地址
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年12月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        char * FsStrCopy(char *source)
{
    unsigned int i;
    char *destin;
    
    if (source == NULL)
    {
        return NULL;
    }
    destin = FsPathFileName;
    i = MAX_PATHFILE_LENGTHS;
    do
    {
        *destin++ = *source;
        if (*source++ == 0)
        {
            break;
        }
    } while (--i != 0);
    return FsPathFileName;
}
        

/*********************************************************************************************************
** 函数名称: StrToFDTName
** 功能描述: 用户文件\目录名转换为系统名
**
** 输 入: Str:用户名称
**        
** 输 出: 驱动器号
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年9月8日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年4月10日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 StrToFDTName(char *FDTName, char *Str)
{
    uint8 i, temp;
    
    /* 文件\目录名是否有效 */
    if (Str[0] == 0x20 || Str[0] == 0)
    {
        return FILE_NAME_ERR; 
    }

    for (i = 11; i != 0; i--)
    {
        *FDTName++ = 0x20;
    }
    FDTName -= 11;
    

    /* 是否为"." */
    if (Str[0] == '.')
    if (Str[1] == 0 || Str[1] == '\\')
    {
        FDTName[0] = '.';
        return RETURN_OK;
    }

    /* 是否为".." */
    if (Str[0] == '.')
    if (Str[1] == '.' )
    if (Str[2] == 0 || Str[2] == '\\')
    {
        FDTName[0] = '.';
        FDTName[1] = '.';
        return RETURN_OK;
    }
    
    /* 获取主文件/目录名 */
    for (i = 8; i != 0; i--)
    {
        temp = *Str;
        if (temp == 0 || temp == '\\')
        {
            break;
        }
        Str++;
        if (temp == '.')
        {
            break;
        }
        *FDTName++ = temp;
    }
    FDTName += i;
    
    if (*Str == '.')
    {
        Str++;
    }
    /* 获取文件\目录扩展名 */
    for (i = 3; i != 0; i--)
    {
        temp = *Str;
        if (temp == 0 || temp == '\\')
        {
            break;
        }
        Str++;
        *FDTName++ = temp;
    }
    return RETURN_OK;
}

/*********************************************************************************************************
** 函数名称: _GetFDTInfo
** 功能描述: 获取FDT所在的目录的开始簇号及系统内名称,内部使用
**
** 输 入: DirFileName:用户使用的FDT名(包括路径)
**         FDTName:用于返回系统使用的FDT名(不包括路径)
** 输 出: FDT所在的目录的开始簇号,BAD_CLUS表示找不到路径
**         
** 全局变量: 无
** 调用模块: GetDirClusIndex,StrToFDTName
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年4月10日




**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint32 _GetFDTInfo(char *FDTName, char *DirFileName)
{
    uint32 Rt;
    char *temp;
    uint8 i;
    
    extern Disk_Info DiskInfo[MAX_DRIVES];

    /* 获取字符串结束位置 */
    temp = DirFileName;
    while (*temp != 0)
    {
         temp++;
    }
    temp--;
    if (*temp == '\\')  /* 最后字符为\不是有效文件/目录名 */
    {
        return BAD_CLUS;
    }

    
    /* 获取目录开始簇号 */
    Rt = BAD_CLUS;
    while (1)
    {
        if (*temp == '\\' || *temp == ':')
        {
            /* 找到目录分割符号'\' 或 */
            /* 找到逻辑盘分割符号':',表明是指定逻辑盘当前目录 */
            temp++;
            i = *temp;
            *temp = 0;
            Rt = GetDirClusIndex(DirFileName);
            *temp = i;
            break;
        }
        if (temp == DirFileName)
        {
            /* 只有文件\目录名,表明是当前逻辑盘当前目录 */
            //Rt = GetDirClusIndex(".");
            Rt = DiskInfo[CurrentDrive].PathClusIndex;
            break;
        }
        temp--;
    }
    /* 获取系统内文件\目录名 */
    if (StrToFDTName(FDTName, temp) != RETURN_OK)
    {
        Rt = BAD_CLUS;
    }
    return Rt;
}

/*********************************************************************************************************
** 函数名称: GetDrive
** 功能描述: 获取指定目录的驱动器
**
** 输 入: Path:路径名
**        
** 输 出: 驱动器号
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年9月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------



********************************************************************************************************/
        uint8 GetDrive(char *Path)
{
    uint8 Drive;

    Path = FsStrCopy(Path);
    Drive = CurrentDrive;
    if (Path != NULL)
    {
        strupr(Path);                           /* 变为大写 */
        if (Path[1] == ':')
        {
            Drive = Path[0] - 'A';
        }
    }
    return Drive;
}

/*********************************************************************************************************
** 函数名称: ChangeDrive
** 功能描述: 改变当前逻辑盘
**
** 输 入: Drive:逻辑盘符字符串
**        
** 输 出: RETURN_OK:成功
**        NOT_FIND_DISK:逻辑盘不存在
**        PARAMETER_ERR:非法参数
** 全局变量: 无
** 调用模块: strupr,GetDiskInfo
**
** 作 者: 陈明计
** 日 期: 2003年9月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------



********************************************************************************************************/
        uint8 ChangeDrive(char *Drive)
{
    uint8 Rt;
    Disk_Info *Disk;
    

    Rt = PARAMETER_ERR;
    Drive = FsStrCopy(Drive);
    strupr(Drive);                           /* 变为大写 */
    if (Drive[1] == ':')
    {
        Rt = NOT_FIND_DISK;
        Disk = GetDiskInfo(Drive[0] - 'A');
        if (Disk != NULL)
        {
            CurrentDrive = Drive[0] - 'A';
            Rt = RETURN_OK;
        }
    }
    return Rt;    
}

/*********************************************************************************************************
** 函数名称: GetDirClusIndex
** 功能描述: 获取指定目录开始簇号
**
** 输 入: Path:路径名
**        
** 输 出: 开始簇号,EMPTY_CLUS:为根目录
**
** 全局变量: 无
** 调用模块: strupr,GetDiskInfo,FindFDTInfo
**
** 作 者: 陈明计
** 日 期: 2003年9月8日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年4月10日
**------------------------------------------------------------------------------------------------------



********************************************************************************************************/
        uint32 GetDirClusIndex(char *Path)
{
    char DirName[12];
    uint8 Drive;
    uint32 Rt;
    FDT temp;
    Disk_Info *Disk;
    
    Rt = BAD_CLUS;
    if (Path != NULL)
    {
        Path = FsStrCopy(Path);
        strupr(Path);                           /* 变为大写 */
        Drive = GetDrive(Path);                 /* 获取路基盘符 */
        if (Path[1] == ':')
        {
            Path += 2;
        }
        Disk = GetDiskInfo(Drive);              /* 获取逻辑盘信息 */
        if (Disk != NULL)
        {
            Rt = 0;
            if (Disk->FATType == FAT32)         /* FAT32 根目录 */
            {
                Rt = Disk->RootDirTable;
            }
            if (Path[0] != '\\')                /* 不是目录分隔符号,表明起点是当前路径 */
            {
                Rt = Disk->PathClusIndex;
            }
            else
            {
                Path++;
            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -