📄 pmp_fs_api_za.c
字号:
input:
buf [in] 数据的存放地址
unit_size [in] 一个数据单位的长度
unit_count [in] 数据单位的总数
stream [in] 文件句柄的指针
output:
< 0 失败
>= 0 成功
note:
将内存中的数据写入到文件中
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_fwrite (INT8 *buf, INT32 unit_size,INT32 unit_count, ZA_FILE * stream)
#else
INT32 ZA_fwrite (INT8 *buf, INT32 unit_size,INT32 unit_count, ZA_FILE * stream)
#endif
{
UINT16 err;
UINT32 BytesWant2Write;
UINT32 BytesWritten;
UINT32 FileHandle;
// 判断输入参数是否合法
if ( (NULL == buf) || (NULL == stream)
|| !unit_size || !unit_count )
{
ERROR_REPORT;
return (INT32) QFS_ERR;
}
// 计算需要进行写入的数据总数
BytesWant2Write = unit_size * unit_count;
// 进行文件句柄的计算
err = get_file_handle(stream, &FileHandle);
if(err){
ERROR_REPORT;
return (INT32) QFS_ERR;
}
// flush cache
mmuFlushDCache();
// 使用内部函数进行数据的写入动作
err = fsWrite( (UINT32) FileHandle, buf, BytesWant2Write, &BytesWritten);
// 如果发生错误,直接返回失败
if ( err ) {
ERROR_REPORT;
return (INT32) QFS_ERR;
}
// 返回实际写入的数据的数量
return BytesWritten/unit_size;
}
/************************************************************************/
/* QFS_fclose
input:
stream [in] 已经打开的文件句柄
output:
0 成功,非0 失败
func:
关闭句柄所代表的文件
note:
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_fclose(ZA_FILE * stream)
#else
INT32 ZA_fclose(ZA_FILE * stream)
#endif
{
UINT16 err;
UINT32 FileHandle;
// 判断输入参数是否合法
if (NULL == stream) {
ERROR_REPORT;
return QFS_ERR;
}
// 计算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 进行文件的关闭动作
err = fsClose( FileHandle );
// 有错误发生时,返回负值
if (err){
ERROR_REPORT;
return QFS_ERR;
}
// 返回成功
return QFS_OK;
}
/************************************************************************/
/* QFS_fseek
input:
stream [in] 文件句柄
offset [in] 偏移值
origin [in] 参考点
SEEK_SET // 文件头
SEEK_CUR // 当前位置
SEEK_END // 文件尾
output:
0成功,其他值 失败
func:
注意进行指针移动时,不要穿越实际的文件边界
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_fseek(ZA_FILE *stream, INT32 offset, INT32 origin)
#else
INT32 ZA_fseek(ZA_FILE *stream, INT32 offset, INT32 origin)
#endif
{
UINT16 err;
UINT32 FileHandle;
// 判断指针是否合法
if (NULL == stream){
ERROR_REPORT;
return QFS_ERR;
}
// 判断参考点是否正确
if (!((origin == SEEK_END) || (origin == SEEK_SET) || (origin == SEEK_CUR)))
{
ERROR_REPORT;
return QFS_ERR;
}
// 计算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 进行指针的移动
err = fsSeek( FileHandle, offset, origin);
if( err ){
ERROR_REPORT;
return QFS_ERR;
}
// 返回成功
return QFS_OK;
}
/************************************************************************/
/* QFS_chdir
input:
path [in] 全路径名字符串指针
output:
0 成功, 其他值 失败
func:
进行多级目录的切换动作
切换目录失败的话,不会修改初始的工作目录
note:
modify: taoli_2006.10.13 原函数有问题,fsDirSet会出错,移植S1000文件系统
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_chdir(const INT8 *path)
#else
INT32 ZA_chdir(const INT8 *path)
#endif
{
/*Start of taoli on 2006-10-13 10:3 1.0*/
#if 0
UINT16 err;
INT8 *path_name;
printf( "chdir path = [%s]\n", path );
// 判断输入参数是否合法
if (NULL == path){
ERROR_REPORT;
return QFS_ERR;
}
#ifndef CHANGE_CODE
// 进行路径名的设置
err = fsDirSet( (UINT8 *)path, 0x00);
#else
// 继续编码的转换
path_name = get_unicode_ptr( path );
printf( "chdir path_name = [%s]\n", path_name );
err = fsDirSet( (UINT8 *)path_name, strlen(path_name));
#endif
return (INT32) err;
#else
INT16 i,offset;
INT32 ret;
INT8 now_path[256];
INT8 porgdir[256];
INT8 ptemp[256];
memset( ptemp, 0, 256 );
ZA_getcwd( ptemp, 256 );
if(!strcmp(path, ptemp)) // 判断长文件名与当前的目录名是否一致
{
return 0;
}
memset( porgdir, 0, 256 );
strcpy(porgdir, ptemp); // 将当前工作路径进行备份
offset = 0x00;
ret = 0; // 初始化为成功
while (path[offset] == '\\') { // 越过前面的'\\', 直接指向实际的字符串
offset ++;
}
for(i=THE_LAST_DIR+1; i!= THE_LAST_DIR; )
{
if( offset && (path[offset] == '\0') )
{
break;
}
i = get_dir_from_str((char *)path+offset, now_path); // 取出一级目录名
offset += strlen(now_path); // 指向下一级目录,注意跳过了一个'\\'
while (path[offset] == '\\') { // 越过 '\\'
offset++;
}
if( strlen(now_path) > 255 ) // 检查字符串是否越界
{
ERROR_REPORT;
ret = -1; // 如果文件名超长,直接退出
break;
}
ret = fsDirSet( now_path, strlen(now_path) ); // 尝试着进入该级目录
if(ret) {
ERROR_REPORT;
break; // 切换目录失败,直接退出
}
}
if(!ret) // 切换目录成功,直接返回
{
return ret;
}
else
{
fsDirSet(porgdir, strlen(porgdir)); // 返回 进入时的目录名
}
return ret;
#endif
/*End of taoli on 2006-10-13 10:3 1.0*/
}
/************************************************************************/
/* QFS_getcwd
input:
buffer [out] 缓冲区指针
buffer_size [in] 该缓冲区的长度
output:
NULL 失败
buffer OK!
func:
取出当前的工作路径名(长文件名)
note:
已经调用了编码转换函数
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT8 * QFS_getcwd(INT8 * buffer, INT16 buffer_size)
#else
INT8 * ZA_getcwd(INT8 * buffer, INT16 buffer_size)
#endif
{
UINT16 len;
UINT16 err;
UINT8 *pPath;
// 判断输入参数是否合法
if ((NULL == buffer) || !buffer_size ){
ERROR_REPORT;
return NULL;
}
// 进行输入缓冲区的清空动作
memset(buffer, 0x00, buffer_size);
// 使用内部函数进行
err = fsDirGet( &pPath );
if (err) {
ERROR_REPORT;
return NULL;
}
#ifndef CHANGE_CODE
len = strlen(pPath);
if(len > (buffer_size -1)){ // 判断是否超过输入缓冲区的长度
len = buffer_size -1;
}
memcpy(buffer, pPath, len); // 进行字符串的复制动作
#else
// 将得到的UTF8编码转换为LOCAL 编码
SPMP_uni2local(pPath, buffer);
len = strlen(buffer);
#endif
// 如果是根目录,需要在尾巴上添加"\\"
if (buffer[len-1] == ':') {
buffer[len] = '\\';
}
// 返回成功
return buffer;
}
/************************************************************************/
/* QFS_ftell
input:
stream [in] 文件句柄
output:
<0 失败, >=0 成功
func:
获取当前文件指针的值
note:
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_ftell(ZA_FILE * stream)
#else
INT32 ZA_ftell(ZA_FILE * stream)
#endif
{
UINT16 err;
UINT32 now_position;
UINT32 FileHandle;
// 判断参数是否合法
if (NULL == stream) {
ERROR_REPORT;
return (INT32) QFS_ERR;
}
// 计算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 使用内部函数,进行指针位置的获取动作
err = fsTell( FileHandle, &now_position);
if ( err ) {
ERROR_REPORT;
return QFS_ERR;
}
// 返回文件指针的位置
return now_position;
}
/************************************************************************/
/* QFS_fgetsize
input:
stream [in]
output:
<0 失败
>= 0 文件长度
func:
获文件的长度
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_fgetsize(ZA_FILE * stream)
#else
INT32 ZA_fgetsize(ZA_FILE * stream)
#endif
{
UINT16 err;
UINT32 file_len, FileHandle;
// 计算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 获取文件的长度
err = fsSizeGet( FileHandle, &file_len);
// 出错返回负数
if (err){
ERROR_REPORT;
return (INT32)QFS_ERR;
}
// 返回文件的长度
return file_len;
}
/************************************************************************/
/* QFS_feof
input:
stream [in] 文件句柄
output:
<0 函数出错
0 没有到达文件尾
>0 到达文件尾
func:
判断是否到达文件的末尾
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_feof(ZA_FILE * stream)
#else
INT32 ZA_feof(ZA_FILE * stream)
#endif
{
UINT16 err;
INT32 f_size;
INT32 now_position;
UINT32 FileHandle;
// 判断输入参数是否合法
if(NULL == stream) {
ERROR_REPORT;
return QFS_ERR;
}
// 计算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 获取文件的长度
err = fsSizeGet( FileHandle, &f_size);
if( err ) {
ERROR_REPORT;
return QFS_ERR;
}
// 使用内部函数,进行指针位置的获取动作
err = fsTell( FileHandle, &now_position);
if ( err ) {
ERROR_REPORT;
return QFS_ERR;
}
// 判断是否到达文件尾
if( now_position < f_size) {
return 0;
}
// 到达文件尾
return 1;
}
/************************************************************************/
/* QFS_opendir
input:
pPath [in] UINT8 * 路径名字符串指针
output:
NULL 失败, 非NULL值成功
func:
note:
如果是跟目录,则进行"\\"的添加动作
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
ZA_DIR * QFS_opendir(const INT8 *pPath)
#else
ZA_DIR * ZA_opendir(const INT8 *pPath)
#endif
{
UINT16 i,err;
UINT8 *pbuf;
UINT8 *pCurrDir;
// 判断输入参数是否合法
if (NULL == pPath) {
ERROR_REPORT;
return NULL;
}
// 获取当前的工作路径
err = fsDirGet( &pCurrDir );
if (err) {
ERROR_REPORT;
return NULL;
}
//DEBUG_OUTPUT(("CurrDir..... %s\r\n", pCurrDir));
// 获得当前路径字符串的长度
i = strlen(pCurrDir);
// 进行内存的申请动作
pbuf = (UINT8 *) MEM_ALLOC( (UINT32)(i+4) );
if (NULL == pbuf) {
ERROR_REPORT;
return NULL;
}
// 将当前工作路径保存到申请的内存中
strcpy(pbuf, pCurrDir);
if ( !strcmp(pbuf,"C:") || !strcmp(pbuf, "D:") ) {
strcat(pbuf, "\\");
}
#ifndef CHANGE_CODE
// 切换到目标目录
err = fsDirSet((UINT8 *)pPath, 0x00);
#else
UINT8 *ptemp;
ptemp = get_unicode_ptr( pPath );
err = fsDirSet(ptemp, 0x00);
#endif
// 切换目录失败
if (err) {
ERROR_REPORT;
MEM_FREE( pbuf);
return NULL;
}
// 进行第一次的搜索
err = fsFirstFileFind( );
// 寻找失败
if (err) {
ERROR_REPORT;
MEM_FREE( pbuf);
return NULL;
}
// 返回备份原目录的内存值
return pbuf;
}
/************************************************************************/
/* QFS_readdir
input:
pdir [in]
buffer [in]
pinfo [out]
output:
< 0 失败
= 0 成功
> 0 结束
func:
读取文件夹下的文件名、目录名
note:
已进行编码的转换
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -