📄 pmp_fs_api_za.c
字号:
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_readdir(ZA_DIR * pdir, INT8 * buffer, FILE_INFO *pinfo )
#else
INT32 ZA_readdir(ZA_DIR * pdir, INT8 * buffer, FILE_INFO *pinfo )
#endif
{
INT8 *ptemp;
UINT16 err;
File_Info_t FileInfoAttr;
// 进行初始化的动作
buffer[0] = '\0';
memset( &(FileInfoAttr), 0x00, sizeof(FileInfoAttr));
// 判断输入参数是否合法
if ( (NULL == pdir) || (NULL == buffer) || ( NULL == pinfo) ) {
ERROR_REPORT;
return QFS_ERR;
}
// 进行一次目录的读取动作
err = fsNextFileFind(&FileInfoAttr);
// 目录读取结束了
if ( FS_ERR_END_OF_DIRECTORY == err ) {
return 1;
}
// 读取失败
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 属性
pinfo->attribute = FileInfoAttr.attr;
pinfo->file_size = FileInfoAttr.fileSize;
// 进行时间信息的复制动作
memcpy(&(pinfo->f_tm), &(FileInfoAttr.tCreate), sizeof(FileInfoAttr.tCreate));
// 判断使用哪个文件名指针
ptemp = FileInfoAttr.s8_3_FileName;
if (FileInfoAttr.longLen){
ptemp = FileInfoAttr.sLongFileName;
}
#ifndef CHANGE_CODE
strcpy(buffer, ptemp); // 进行字符串的复制
#else
SPMP_uni2local(ptemp, buffer); // 进行编码的转换
#endif
return QFS_OK;
}
/************************************************************************/
/* QFS_closedir
input:
pdir [in]
output:
0 成功, 非0值失败
func:
进行目录的关闭动作
note:
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_closedir(ZA_DIR * pdir)
#else
INT32 ZA_closedir(ZA_DIR * pdir)
#endif
{
UINT16 err;
DEBUG_OUTPUT((">> close dir %s\r\n", pdir));
// 判断参数是否合法
if (NULL == pdir){
ERROR_REPORT;
return QFS_ERR;
}
// 将路径切换到原来的目录上
err = fsDirSet(pdir, 0x00);
if ( err) {
ERROR_REPORT;
return QFS_ERR;
}
// 释放内存
MEM_FREE( pdir );
// 返回成功
return QFS_OK;
}
/************************************************************************/
/* QFS_getfsize
input:
stream [in] 文件句柄指针
plen [out] 存放获得的文件长度的指针
output:
0 成功 非0值失败
function:
通过一个打开的文件句柄,获得该文件的长度
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_getfsize(ZA_FILE *stream, INT32 *plen)
#else
INT32 ZA_getfsize(ZA_FILE *stream, INT32 *plen)
#endif
{
UINT16 err;
UINT32 len, FileHandle;
*plen = 0x00;
// 判断输入参数是否合法
if ( (NULL == stream) || (NULL == plen) ){
ERROR_REPORT;
return QFS_ERR;
}
// 计算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 获得文件的长度
err = fsSizeGet( FileHandle, &len );
if ( err ) {
ERROR_REPORT;
return QFS_ERR;
}
// 保存获得的长度
*plen = len;
// 返回成功
return QFS_OK;
}
/************************************************************************/
/* 设定文件属性
input:
file_name [in] 文件名字符串的指针
attr [in] 新需要设定的属性
output:
0 成功 非0值 失败
func:
note:
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_setattr (INT8 *file_name, UINT8 attr)
#else
INT32 ZA_setattr (INT8 *file_name, UINT8 attr)
#endif
{
INT8 *pfile;
UINT16 err;
// 判断参数是否合法
if ( NULL == file_name ) {
ERROR_REPORT;
return QFS_ERR;
}
#ifndef CHANGE_CODE
err = fsAttrSet( file_name, attr ); // 进行文件属性的设定
#else
pfile = get_unicode_ptr( file_name );
err = fsAttrSet(pfile, attr ); // 进行文件属性的设定
#endif
// 返回成功
return QFS_OK;
}
/************************************************************************/
/* 获取逻辑驱动器的信息
input:
dname 驱动器内部逻辑名字符串的指针
"C:\\" "D:\\"
dinfo 存放 设备信息的结构体的指针
output:
0 成功, 非0值失败
func:
根据输入的驱动器内部名称字符串,找出其设备信息
note:
在 SPMP3XXX 环境中 NAND --> D盘 SD --> C盘
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_getdriveinfo (const INT8 *dname, DRIVE_INFO *dinfo)
#else
INT32 ZA_getdriveinfo (const INT8 *dname, DRIVE_INFO *dinfo)
#endif
{
UINT16 err, DevID;
Dev_Info_t tmp_info;
// 进行清空的动作
memset(dinfo, 0x00, sizeof(DRIVE_INFO));
// 通过字符串获得设备的内部代号
err = get_devid_by_name( (UINT8 *)dname, &DevID);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 判断输入参数是否合法
if ((NULL == dname) || (NULL == dinfo)) {
ERROR_REPORT;
return QFS_ERR;
}
// 获取设备的信息
err = fsDevInfoGet(&tmp_info, (UINT8) DevID);
if ( err ) {
ERROR_REPORT;
return QFS_ERR;
}
// 进行信息的复制动作
dinfo->DirtyClu = 0x00; // 不提供 垃圾扇区的数量
dinfo->sectorSize = QFS_SECTOR_SIZE; // 扇区的大小是 512 字节
dinfo->sectorPerClu = tmp_info.clusterSize/QFS_SECTOR_SIZE; // 计算簇内扇区的数量
dinfo->freeClu = tmp_info.availSpace/tmp_info.clusterSize; // 可用空间的簇总数
dinfo->totalSec = tmp_info.capacity/QFS_SECTOR_SIZE; // 扇区的总数
// 返回成功
return QFS_OK;
}
/************************************************************************/
/* QFS_remove
input:
file_name [in] 文件名字符串指针
output:
0 成功,非0 值失败
func:
输入文件名字符串指针, 删除该文件
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_remove(const INT8 * file_name)
#else
INT32 ZA_remove(const INT8 * file_name)
#endif
{
UINT16 err;
// 判断输入参数是否合法
if (NULL == file_name) {
ERROR_REPORT;
return QFS_ERR;
}
#ifndef CHANGE_NODE
// 进行文件的删除动作
err = fsDelete( (UINT8 *) file_name );
#else
pfile = get_unicode_ptr( file_name );
err = fsDelete( (UINT8 *)pfile ); // 进行文件的删除动作
#endif
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 返回成功
return QFS_OK;
}
/************************************************************************/
/* QFS_fgetc
input:
stream [in] 文件指针
output:
0 成功,非0值失败
func:
从文件中读取一个字符
note:
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_fgetc( ZA_FILE * stream )
#else
INT32 ZA_fgetc( ZA_FILE * stream )
#endif
{
UINT16 err;
UINT32 i, FileHandle;
UINT8 buffer[0x10];
// 判断输入参数是否合法
if (NULL == stream) {
ERROR_REPORT;
return QFS_ERR;
}
// 计算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
// 进行数据的读取
err = fsRead( (UINT32 )FileHandle, buffer, sizeof(UINT8), &i);
if ( err ) {
ERROR_REPORT;
return QFS_ERR;
}
// 返回读到的数据
return (INT32) buffer[0];
}
/************************************************************************/
/* QFS_fgets
input:
stream [in] 文件句柄
n [in] 缓冲区的长度
str [out] 存放读到的字符串的指针
output:
0 成功, 非0值失败
remark:
Return Value:
GGV_OK success
GGV_ERROR failure
Each of these functions returns string. NULL is returned to indicate an error or
an end-of-file condition. Use feof or ferror to determine whether an error occurred.
Remarks
The fgets function reads a string from the input stream argument and stores it in string.
fgets reads characters from the current stream position
to and including the first newline character,
to the end of the stream, or until the number of characters read is equal to n-1,
whichever comes first. The result stored in string is appended with a null character.
The newline character, if read, is included in the string.
************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_fgets(INT8 * str, INT32 n, ZA_FILE *stream)
#else
INT32 ZA_fgets(INT8 * str, INT32 n, ZA_FILE *stream)
#endif
{
UINT16 err;
INT32 i,j,k;
char * ptemp;
INT32 found;
INT32 data_read_in;
UINT32 BytesRead;
UINT32 FileHandle;
// 计算文件句柄
err = get_file_handle(stream, &FileHandle);
if (err) {
ERROR_REPORT;
return QFS_ERR;
}
i = 0x00;
found = 0x00;
data_read_in = 0x00;
str[0] = '\0'; // set str to NULL
// 进行文件内容的试读
// 先读出 64 字节的文件内容,进行判断是否有数据,如果有OK
//
// data_read_in 读进的数据的累加值
//
// j 每次需要读进来的预设值
//
// k 每次实际要读的值
for(j= 0x80, data_read_in = 0x00; data_read_in < n-1; j+=j)
{
// 判断所剩下的数据的长度是否大于预读值
if( n-data_read_in -1 >j){
k = j;
}
else{
k = n - data_read_in - 1; // 计算预读值
}
// 进行数据的读动作
err = fsRead( FileHandle, str+data_read_in, k, &BytesRead );
if ( err ) {
break;
}
data_read_in += BytesRead; // 进行数据长度的累加
// 判断是否到达文件尾
if(BytesRead != k) {
str[data_read_in] = '\0';
}
// 对读进来的数据进行判断
ptemp = strchr(str, '\n'); // 判断 '\n' 是否存在
if(ptemp == NULL){
ptemp = strchr(str, '\r'); // 判断 '\r' 是否存在
}
if(ptemp != NULL)
{
*(ptemp+1) = '\0'; // '\n' 或者 '\r' 存在, 进行补0 的动作
i = (UINT32) ptemp - (UINT32)str + 1;
found = 0xff;
break; // 不在进行循环的动作,直接退出
}
}
// 如果没有读到数据,遇到文件尾吧结束的情形
if(!data_read_in) {
ERROR_REPORT;
return QFS_ERR; // 直接失败退出
}
// 已经读到数据,但是没有找到想要的标志
if(!found) {
str[data_read_in] = '\0'; // 没有找到,补0 直接返回不需要调整指针
return QFS_OK;
}
// 进行文件指针的调整
if(i != data_read_in){
i -= data_read_in;
// 进行文件指针的移动
err = fsSeek( FileHandle, i, SEEK_CUR);
}
// 返回结果
return err;
}
/************************************************************************/
/*
// QFS_access
input:
fname [in] 文件名字符串的指针
mode [in] 模式
// mode
// 0 文件(目录)是否存在
// 2 文件是否可以写
// 4 文件是否可读
// 6 文件是否可存取
//
output:
0 成功, -1 失败
func:
判断文件是否存在
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_access(INT8 *filename, INT32 mode)
#else
INT32 ZA_access(INT8 *filename, INT32 mode)
#endif
{
INT32 i, ret;
INT32 attribute;
struct f_info temp_info;
i = ZA_stat(filename, &temp_info);
attribute = temp_info.attribute;
ret = QFS_ERR;
/*Start of taoli on 2006-10-12 17:53 1.0*/
if(i)
{
return ret;
}
/*End of taoli on 2006-10-12 17:53 1.0*/
switch(mode)
{
case F_OK:
ret = QFS_OK;
break;
case R_OK:
if((attribute&FAT_READ_ONLY) | (attribute&FAT_ARCHIVE)) {
ret = QFS_OK; // 判断文件 是否可读 或者 是否可存取
}
break;
case W_OK:
if( attribute&FAT_ARCHIVE ) {
ret = QFS_OK;
}
break;
case (R_OK|W_OK):
if( attribute&FAT_ARCHIVE ) {
ret = QFS_OK;
}
break;
default:
ret = QFS_ERR; // 文件是否存在
break;
}
return ret;
}
/************************************************************************/
/* QFS_rename
input:
oldname [in] 原始文件名字符串的指针
newname [in] 将要生成的文件名字符串的指针
output:
0 成功 非0值 失败
func: 将一个文件名 修改为 另外一个文件名
不允许跨越 逻辑驱动器
可以跨越目录
原始文件 必须存在
新的文件名 必须不存在
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
INT32 QFS_rename(INT8 * oldname, INT8 * newname)
#else
INT32 ZA_rename(INT8 * oldname, INT8 * newname)
#endif
{
ERROR_REPORT;
return QFS_ERR;
}
/************************************************************************/
/*
input:
打开的目录结构体
output:
void
func:
将当前的目录进行复位
*/
/************************************************************************/
#ifndef _FOR_A3K_PROG
void QFS_rewinddir(ZA_DIR *dirp)
#else
void ZA_rewinddir(ZA_DIR *dirp)
#endif
{
UINT16 err,len;
UINT8 *pCWD;
UINT8 *pbuf;
// get current working path
fsDirGet( &pCWD );
DEBUG_OUTPUT(("now:----%s\r\n",pCWD));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -