📄 file.c
字号:
// -->DBX_device->left_hand.io_ctrl
// -->DBX_left_ctrl (用enum_DBX_flush命令)
// -->__DBX_flush_file
//参数:DBX_lhdl,被操作文件所属的文件柜
// buf,数据缓冲区指针
// fp,被关闭的文件(目录)指针
//返回:写入存储介质的数据量
//----------------------------------------------------------------------------
uint32_t __DBX_flush_file(struct dev_handle *DBX_lhdl,struct file_rsc *fp)
{
struct st_DBX_device_tag *DBX_device_tag;
uint32_t result;
DBX_device_tag =(struct st_DBX_device_tag*)
DBX_lhdl->dev_interfase->private_tag;
result = DBX_device_tag->flush(fp);
return result;
}
//----flush文件柜的所有文件----------------------------------------------------
//功能: 把文件柜中所有文件的写缓冲区的数据写入到存储器中,并清空写缓冲区。
// 调用顺序:
// 用户调用fflush
// -->dev_ctrl
// -->DBX_device->left_hand.io_ctrl
// -->DBX_left_ctrl (用enum_DBX_flush_all命令)
// -->__DBX_flush_all
//参数:DBX_lhdl,被操作文件所属的文件柜
//返回:0
//----------------------------------------------------------------------------
uint32_t __DBX_flush_all(struct dev_handle *DBX_lhdl)
{
struct st_DBX_device_tag *DBX_device_tag;
struct rsc_node *current,*start,*temp;
struct file_rsc *item;
DBX_device_tag = (struct st_DBX_device_tag *)
DBX_lhdl->dev_interfase->private_tag;
start = &DBX_device_tag->opened_root->file_node;
current = &DBX_device_tag->opened_root->file_node;
while((temp = rsc_trave_scion(start,current)) != NULL)
{//此循环遍历整个文件柜所有打开的文件和目录
item = (struct file_rsc *)temp;
if( ! item->attr.bits.folder) //如果是文件,则刷到存储器
__DBX_flush_file(DBX_lhdl,item);
current = temp; //rsc_search_tree函数下次调用的起点
}
return 0;
}
//----文件柜设备左手控制函数-------------------------------------------------
//功能:顾名思义,执行一系列上层发下来的文件系统控制命令
//参数:DBX_lhdl,左手设备句柄指针
// left_cmd,左手命令字,使用时转换成enum DBX_left_cmd类型
// data1、data2,跟命令字相关的数据
//返回:与命令字相关,参见源程序注释
//-----------------------------------------------------------------------------
ptu32_t DBX_left_ctrl(struct dev_handle *DBX_lhdl,uint32_t left_cmd,
uint32_t data1,uint32_t data2)
{
struct st_DBX_device_tag *DBX_device_tag = (struct st_DBX_device_tag *)
(DBX_lhdl->dev_interfase->private_tag);
struct file_rsc *root_folder;
switch((enum DBX_left_cmd)left_cmd)
{
case enum_DBX_format:
{//格式化文件柜,data1是格式化参数
if(DBX_device_tag->format(data1,DBX_device_tag))
{
if(DBX_device_tag->opened_root == NULL)
{
//申请根目录资源结点内存
root_folder = mb_malloc(pg_content_pool,0);
if(root_folder == NULL)
{
DBX_device_tag->formatted = false;
return enum_fs_create_root_folder_error;
}
memset(root_folder,0,sizeof(struct file_rsc));
//把新文件柜的根目录资源节点加入到文件根资源结点下,
rsc_add_son(&tg_opened_file_root,&root_folder->file_node,
sizeof(struct file_rsc),DBX_device_tag->name);
//文件柜设备的打开文件的根结点指向该根资源结点。
DBX_device_tag->opened_root = root_folder;
root_folder->home_DBX = DBX_lhdl->dev_interfase;
}
DBX_device_tag->formatted = true;
return enum_fs_no_error;
}else
{
DBX_device_tag->formatted = false;
return enum_fs_format_DBX_error;
}
}break; //for enum_DBX_format
case enum_DBX_lookfor:
{//查找文件,data1是文件名(目录名)
return (ptu32_t)__djyfs_DBX_lookfor_item(DBX_lhdl,(char*)data1);
}break; //for enum_DBX_lookfor
case enum_DBX_open:
{//打开文件,data1是文件名,data2是模式字符串,返回文件指针
return (ptu32_t)__djyfs_DBX_open_file(DBX_lhdl,(char*)data1,(char*)data2);
}break; //for enum_DBX_open
case enum_DBX_remove:
{//data1是文件(目录)名,data2不用
return (ptu32_t)__djyfs_DBX_remove_item(DBX_lhdl,(char*)data1);
}break; //for enum_DBX_remove
case enum_DBX_rename:
{//data1是原文件(目录)名,data2是新文件名
return (ptu32_t)__DBX_rename_item(DBX_lhdl,(char*)data1,(char*)data2);
}break; //for enum_DBX_rename
case enum_DBX_close:
{
return (ptu32_t)__DBX_close_item(DBX_lhdl,(struct file_rsc*)data1);
}break; //for enum_DBX_close
case enum_DBX_flush:
{
if(__DBX_flush_file(DBX_lhdl,(struct file_rsc *)data1)==0)
return (ptu32_t)EOF;
else
return 0;
} break; //for enum_DBX_flush
case enum_DBX_seek:
{
return (ptu32_t)DBX_device_tag->seek_file((struct file_rsc *)data2,
(struct seek_para *)data1);
} break; //for enum_DBX_seek
default : break;
}
return 0;
}
//----文件柜设备右手控制函数-------------------------------------------------
//功能:顾名思义,执行一系列存储设备driver发出的文件系统控制命令
//参数:DBX_rhdl,右手设备句柄指针
// right_cmd,右手命令字,使用时转换成enum DBX_right_cmd类型
// data1、data2,跟命令字相关的数据
//返回:与命令字相关,参见源程序注释
//-----------------------------------------------------------------------------
ptu32_t DBX_right_ctrl(struct dev_handle *DBX_rhdl,uint32_t right_cmd,
ptu32_t data1,ptu32_t data2)
{
switch((enum DBX_right_cmd)right_cmd)
{
case enum_DBX_clr_readbuf:
{//清除文件的读缓冲区,data1是文件指针
if(((struct file_rsc*)data1)->p_read_buf != NULL)
ring_flush(((struct file_rsc*)data1)->p_read_buf);
return 0;
}break; //for enum_DBX_clr_readbuf
case enum_DBX_clr_writebuf:
{//清除文件的写缓冲区,data1是文件指针
if(((struct file_rsc*)data1)->p_write_buf != NULL)
ring_flush(((struct file_rsc*)data1)->p_write_buf);
return 0;
}break; //for enum_DBX_clr_writebuf
case enum_DBX_flush_one:
{//
return (ptu32_t)__DBX_flush_file(DBX_rhdl,(struct file_rsc *)data1);
}break; //for enum_DBX_flush_one
case enum_DBX_flush_all:
{//
return (ptu32_t)__DBX_flush_all(DBX_rhdl);
}break; //for enum_DBX_flush_all
case enum_DBX_update_medium_tag:
{//修改(设置)一个文件的媒体标记,data1为文件指针,data2为新标记
;
}break; //for enum_DBX_update_medium_tag
case enum_DBX_search_medium_tag:
{//搜索一个文件的媒体标记,data1为该文件的媒体标记,返回文件指针
;
}break; //for enum_DBX_search_medium_tag
default:break;
}
return 0;
}
//----打开文件柜左手接口------------------------------------------------------
//功能: 根据文件(目录)名,打开与之对应的文件柜左手接口。
//参数: fullname,文件(目录)名指针
//返回:设备句柄,出现下列情况返回NULL:
// 1.文件柜不存在 2.fullname和pg_work_path_name均没有指定文件柜名
//----------------------------------------------------------------------------
struct dev_handle *__openum_DBX_left(char *fullname)
{
struct dev_handle *DBX_lhdl;
char DBX_name[256];
uint16_t name_len;
name_len = __djyfs_if_contain_DBX_name(fullname);
if(name_len != 0)
{//fullname是包括文件柜名在内的全路径(也可以是当前文件柜)
memcpy(DBX_name,fullname,name_len); //从参数中copy文件柜名
DBX_name[name_len] = '\0'; //写入串结束符
}else
{//fullname中没有指定文件柜名,应从当前工作路径中取
if(pg_work_path_name == NULL)
return NULL; //当前路径空,返回空
//当前路径只要不是空串,就肯定是包含文件柜名的合法串。
name_len = __djyfs_if_contain_DBX_name(pg_work_path_name);
memcpy(DBX_name,pg_work_path_name,name_len);//从当前目录中提取文件柜名
DBX_name[name_len] = '\0'; //写入串结束符
}
DBX_lhdl = dev_open_left_scion(pg_fs_lhdl,DBX_name,0); //打开文件柜设备
return DBX_lhdl;
}
//----从目录中取一字-----------------------------------------------------------
//功能: 从一个可能包含多级路径名和文件名的字符串curent_offset位置开始取出一个
// 由'\'分隔的word
//参数: synname,输入字符串,格式如"\aaa\bbb\ccc.txt"
// start_offset,搜索起始位置指针
// name,保存取得的字符串的缓冲区指针
//返回: true=成功
// false=失败,1、已经完成最后一个目录字
// 2、synname中根本就不包含目录字
// 3、字长超过255字符
// 在*name中返回取得的字符串
//备注: synname应该是经过合法性检查的字符串,不会出现word超长的问题
//-----------------------------------------------------------------------------
bool_t __pick_word(char *synname,uint32_t curent_offset,char *name)
{
uint32_t index = 0;
//synname是已经经过字符串长度合法性检查的指针
uint32_t name_len = strlen(synname);
uint32_t offset = curent_offset;
for( ; offset< name_len; offset++)
{
if(synname[offset] == '\\') //遇到字符'\'
{
name[index] = '\0';
return true;
}else //未遇到字符'\'。
{
if(index == cn_file_name_limit)
return false;
name[index] = synname[offset]; //复制当前字符到文件名串
index++;
}
}
return true; //若正确提取目录字,程序不会运行至此
}
//----取一目录名字-------------------------------------------------------------
//功能: 从一个可能包含多级路径名和文件名的字符串中curent_offset位置开始取出一个
// 目录名
//参数: synname,输入字符串,格式如"\aaa\bbb\ccc.txt"
// start_offset,搜索起始位置指针
// name,保存取得的字符串的缓冲区指针
//返回: true=成功
// false=失败,1、已经完成最后一个目录字
// 2、synname中根本就不包含目录字
// 3、字长超过255字符
// 在*name中返回取得的字符串
//备注: synname应该是经过合法性检查的字符串,不会出现word超长的问题
//-----------------------------------------------------------------------------
bool_t __pick_path_word(char *synname,uint32_t curent_offset,char *name)
{
uint32_t index = 0;
//synname是已经经过字符串长度合法性检查的指针
uint32_t name_len = strlen(synname);
uint32_t offset = curent_offset;
for( ; offset< name_len; offset++)
{
if(synname[offset] == '\\') //遇到字符'\'
{
name[index] = '\0';
return true;
}else //未遇到字符'\'。
{
if(index == cn_file_name_limit)
return false;
name[index] = synname[offset]; //复制当前字符到文件名串
index++;
}
}
return false; //若正确提取目录字,程序不会运行至此
}
//----取文件名串---------------------------------------------------------------
//功能: 从一个可能包含多级路径名和文件名的字符串中取出文件名
//参数: synname,输入字符串,格式如"\aaa\bbb\ccc.txt"
// start_offset,搜索起始位置指针
// name,保存取得的字符串的缓冲区指针
//返回: true=成功
// false=失败,synname中不包含文件名
// 在*name中返回取得的字符串
//备注: synname应该是经过合法性检查的字符串,不会出现word超长的问题
//-----------------------------------------------------------------------------
bool_t __pick_filename_word(char *synname,char *name)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -