📄 file.c
字号:
{
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 + -