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

📄 pmp_fs_api_za.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 4 页
字号:
  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 + -