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

📄 file.c

📁 新一代基于事件的嵌入式操作系统dyos在三星的s3c44b0的arm芯片上的完整移植代码
💻 C
📖 第 1 页 / 共 5 页
字号:
{
    uint32_t index = 0;
    //synname是已经经过字符串长度合法性检查的指针
    uint32_t name_len = strlen(synname);
    uint32_t offset;
    for(offset = name_len; offset >0; offset--)
    {//从最后一个字符搜索字符'\'
        if(synname[offset-1] == '\\')    //遇到字符'\'
            break;
    }
    if(offset == name_len)      //最后一个字符就是'\',串中没有文件名
        return false;
    else if((name_len -offset) > cn_file_name_limit)    //文件名超长
        return false;
    for( ; offset < name_len; offset++)
    {
        name[index] = synname[offset];
        index++;
    }
    name[index] = '\0';
    return true;
}

//----忽略路径中的文件柜部分---------------------------------------------------
//功能: 忽略文件(目录)名字符串中关于文件柜的部分,提取synname,比如,
//      输入"c:\aaa\bbb\ccc.txt",将返回"\aaa\bbb\ccc.txt"
//参数: fullname,输入字符串
//返回: 取得的路径串
//----------------------------------------------------------------------------
char *__pick_synname(char *fullname)
{
    return fullname + __djyfs_if_contain_DBX_name(fullname) +1;
}

//----检查路径名是否合法------------------------------------------------------
//功能: 检查路径名是否合法,与windows兼容,暂不考虑网络路径名,方法如下:
//      1.由字符':'分隔的文件柜名长度必须合法,':'后面必须是字符'\'
//      2.不允许出现连续两个'\'。
//      3.不允许出现'* ? / | < > "'这7个字符,这些字符可能用于特殊用途
//      4.不允许出现长度超过255字符的object
//参数: fullname,被测字符串
//返回: true=合法,false=非法
//----------------------------------------------------------------------------
bool_t __check_fullname(char *fullname)
{
    uint32_t colon_offset = cn_limit_uint32,syn_offset;
    uint32_t loop,temp;
    ufast_t depth = 0;
    if(fullname == NULL)
        return false;
    //无需使用strlen检查fullname长度,因为接下来的所有检查项目都在限定长度内
    //操作。
    for(loop = 0; loop <= cn_DBX_name_limit; loop++)
    {//检查串中第一个':'出现在什么位置
        if((fullname[loop]=='*')||(fullname[loop]=='/')||(fullname[loop]=='?')
           ||(fullname[loop]=='<')||(fullname[loop]=='>')||(fullname[loop]=='|')
           ||(fullname[loop]=='"'))
            return false;   //名称串中不能出现这几个字符的
        if(fullname[loop] == ':')
        {
            colon_offset = loop; //第一个':'出现的位置,用于检查文件柜名长度
            break;
        }
        if(fullname[loop] == '/')   //出现word分隔符。
            break;
    }
    if(colon_offset == 0)
        return false;       //首字符不能是':'
    if(colon_offset != cn_limit_uint32) //':'位置合法(含文件柜名且长度合法)
    {
        if(fullname[colon_offset+1] != '\\')
            return false;       //冒号后面必须是字符'\'
        syn_offset = colon_offset + 2;
    }else if(fullname[0] =='\\')
        syn_offset = 1;
    else
        syn_offset = 0;
    temp = 0;
    //检查有没有超过cn_file_name_limit字符的object,并检查有没有非法字符
    //不算文件柜名,全路径所包含的字符个数不会超过
    //cn_path_depth_limit * (cn_file_name_limit+1),+1是包含word分隔符'\'
    for(loop = syn_offset;
               (loop < cn_path_depth_limit*(cn_file_name_limit+1)+syn_offset);
               loop++)
    {
        //从文件柜名后面开始继续检查非法字符,此时连冒号':'也是非法字符
        if((fullname[loop]=='*')||(fullname[loop]=='/')||(fullname[loop]=='?')
           ||(fullname[loop]=='<')||(fullname[loop]=='>')||(fullname[loop]=='|')
           ||(fullname[loop]=='"')||(fullname[loop]==':'))
            return false;   //含有这几个非法字符,
        if(fullname[loop] == '\0')
            return true;
        if(fullname[loop] == '\\')
        {
            if(temp == 0)
                return false;       //说明遇到连续的word分隔符'\'
            temp = 0;
            depth++;
        }else
        {
            if(depth >= cn_path_depth_limit)    //路径过深
                return false;
            temp++;
            if(temp > cn_file_name_limit)       //word长度超限
                return false;
        }
    }
    return false;       //能跑到这里,肯定没有找到串结束符
}

//----检查单项名是否合法------------------------------------------------------
//功能: 检查一个单项的名字是否合法,即不能含'\/?:*'这几个字符
//参数: word,被测字符串,可能是单一路径名,也可能是文件名
//返回: true=合法,false=非法
//----------------------------------------------------------------------------
bool_t __check_word(char *word)
{
    uint32_t loop;
    //word是已经经过字符串长度合法性检查的指针
    for(loop = 0; loop < strlen(word); loop++)
    {
        if((word[loop]=='*')||(word[loop]=='/')
                        ||(word[loop]=='?')||(word[loop] == ':'))
            return false;   //含有这几个非法字符,
    }
    return true;
}

//----打开文件----------------------------------------------------------------
//功能: 这是文件系统提供的一个API调用,用于打开文件系统中的一个文件
//参数: fullname,文件名
//      mode,文件打开模式
//返回: 成功打开则返回文件指针,否则返回NULL。
//备注:是否允许打开路径(即fullname中不含文件名)待确定--db
//-----------------------------------------------------------------------------
djyfs_file *djyfs_fopen(char *fullname, char *mode)
{
    struct file_rsc *result;
    struct  dev_handle *DBX_lhdl;
    struct st_DBX_device_tag *DBX_device_tag;
    char *synname;

    if(__check_fullname(fullname) == false)     //fullname不是一个合法的字符串
        return NULL;
    DBX_lhdl = __openum_DBX_left(fullname);
    if(DBX_lhdl == NULL)
        return NULL;    //文件柜不存在,或fullname和当前路径均没有指定文件柜名
    DBX_device_tag = (struct st_DBX_device_tag *)
                        DBX_lhdl->dev_interfase->private_tag;
    if(DBX_device_tag->formatted)
    {
        synname = __pick_synname(fullname);
        //调用文件柜的左手控制函数
        result = (struct file_rsc *)dev_ctrl(DBX_lhdl,enum_DBX_open,
                          (ptu32_t)synname,(ptu32_t)mode);
    }else
        result = NULL;
    dev_close_left(DBX_lhdl);
    return result;
}

//----查找文件----------------------------------------------------------------
//功能: 这是文件系统提供的一个API调用,用于检查文件(目录)是否存在
//参数: fullname,文件(目录)名
//返回: 找到则返回true,找不到返回false
//-----------------------------------------------------------------------------
bool_t djyfs_fsearch(char *fullname)
{
    bool_t result;
    struct  dev_handle *DBX_lhdl;
    struct st_DBX_device_tag *DBX_device_tag;
    char *synname;

    if(fullname == NULL)
        return false;
    if(!__check_fullname(fullname))
        return false;
    DBX_lhdl = __openum_DBX_left(fullname);
    if(DBX_lhdl == NULL)
        return false;    //文件柜不存在,或fullname和当前路径均没有指定文件柜名
    DBX_device_tag = (struct st_DBX_device_tag *)
                        DBX_lhdl->dev_interfase->private_tag;
    if(DBX_device_tag->formatted)
    {
        synname = __pick_synname(fullname);
       //调用文件柜的左手控制函数
       result = (bool_t)dev_ctrl(DBX_lhdl,enum_DBX_lookfor,(ptu32_t)synname,0);
    }else
        result = false;
    dev_close_left(DBX_lhdl);
    return result;
}

//----删除文件----------------------------------------------------------------
//功能: 这是文件系统提供的一个API调用,用于删除一个文件(目录)
//参数: fullname,文件(目录)名
//返回: 0=成功,非0=失败
//-----------------------------------------------------------------------------
uint32_t djyfs_remove(char *fullname)
{
    uint32_t result;
    struct  dev_handle *DBX_lhdl;
    struct st_DBX_device_tag *DBX_device_tag;
    char *synname;

    if(fullname == NULL)
        return 1;
    if(!__check_fullname(fullname))
        return 1;
    DBX_lhdl = __openum_DBX_left(fullname);
    if(DBX_lhdl == NULL)
        return 1;    //文件柜不存在,或fullname和当前路径均没有指定文件柜名
    DBX_device_tag = (struct st_DBX_device_tag *)
                        DBX_lhdl->dev_interfase->private_tag;
    if(DBX_device_tag->formatted)
    {
        synname = __pick_synname(fullname);
        //调用文件柜的左手控制函数
        if(dev_ctrl(DBX_lhdl,enum_DBX_remove,(ptu32_t)synname,0)== enum_fs_no_error)
            result = 0;
        else
            result = 1;
    }else
        result = 1;
    dev_close_left(DBX_lhdl);
    return result;
}

//----修改文件(目录)名字-------------------------------------------------------
//功能: 这是文件系统提供的一个API调用,用于修改一个文件(目录)的名字
//参数: old_fullname,文件(目录)旧名
//      new_filename,新名字
//返回: 0=成功,非0 = 失败
//-----------------------------------------------------------------------------
uint32_t djyfs_rename(char *old_fullname,char *new_filename)
{
    uint32_t result;
    struct  dev_handle *DBX_lhdl;
    struct st_DBX_device_tag *DBX_device_tag;
    char *synname;

    if(old_fullname == NULL)
        return 1;
    if(__check_word(new_filename) == false)
        return 1;
    if(!__check_fullname(old_fullname))
        return 1;
    DBX_lhdl = __openum_DBX_left(old_fullname);
    if(DBX_lhdl == NULL)
        return false;    //文件柜不存在,或fullname和当前路径均没有指定文件柜名
    DBX_device_tag = (struct st_DBX_device_tag *)
                        DBX_lhdl->dev_interfase->private_tag;
    if(DBX_device_tag->formatted)
    {
        synname = __pick_synname(old_fullname);
        //调用文件柜的左手控制函数
        if(dev_ctrl(DBX_lhdl,enum_DBX_rename,(ptu32_t)synname,
                             (ptu32_t)new_filename) == enum_fs_no_error)
            result = 0;
        else
            result = 1;
    }else
        result = 1;
    dev_close_left(DBX_lhdl);
    return result;
}

//----关闭文件-----------------------------------------------------------------
//功能: 这是文件系统提供的一个API调用,用于关闭打来的文件
//参数: fp,被关闭的文件
//返回: 0=成功,cn_limit_uint32=失败。
//-----------------------------------------------------------------------------
uint32_t djyfs_fclose(djyfs_file *fp)
{
    bool_t result;
    struct pan_device *DBX_pan_device;
    struct dev_handle *DBX_lhdl;
    if(fp == NULL)
        return cn_limit_uint32;
    DBX_pan_device = fp->home_DBX;
    DBX_lhdl = dev_open_left_scion(pg_fs

⌨️ 快捷键说明

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