file.c

来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 542 行

C
542
字号
/****************************************************************************/
/*                                                                          */
/*              Copyright (C) 2002 SHENZHEN MEIJIN CO.LTD                   */
/*                                                                          */
/* FILE NAME:   FileTemp.C                                                  */
/* MODULE NAME: FILE MOD                                                    */
/* DESCRIPTION: 文件系统源文件                                              */
/*                                                                          */
/****************************************************************************/
/*    DATE       AUTHOR       VERSION                   REMARKS             */
/* =========== ===========  =========  =====================================*/
/* 2007-11-29     梁如辉    ver 1.00       Build                            */
/****************************************************************************/

#include "nucleus.h"
#include "stdio.h"
#include "io.h"
#include "direct.h"
#include "windows.h"
#include "file.h"

#define NU_FILEERR              -3024

#define MAXOPENFILES            20

#define FLASH_SIZE              0x20000000   // FLASH总大小:512M
#define FLASH_BLOCK_DATASIZE    0x2000       // 每块数据区大小
#define FLASH_BLOCK_USER		0xFE0        // 用户可用的块

#define FILEMODE_MASK           7
#define FILEMODE_READONLY       1           /*以只读方式打开*/
#define FILEMODE_WRITE          2           /*以写方式打开*/
#define FILEMODE_READWRITE      3           /*以读写方式打开*/
#define FILEMODE_APPEND         4           /*附加数据方式打开*/
#define FILEMODE_CREATEWRITE    5           /*若文件不存在则先创建再以读写方式打开*/
#define FILEMODE_NOSHAREWRITE   6           /*不允许其他人共享写文件,黄小明为Mp3增加的,2003/7/21*/

/* File search structure */
typedef struct dstat
{
    CHAR       sfname[9];          /* Null terminated file and extension */
    CHAR       fext[4];
    CHAR       lfname[256]; /* Null terminated long file name */
    UINT8       fattribute;         /* File attributes */
    UINT8       fcrcmsec;           /* File create centesimal mili second */
    UINT16      fcrtime;            /* File create time */
    UINT16      fcrdate;            /* File create date */
    UINT16      faccdate;           /* Access date */
    UINT16      fclusterhigh;       /* High cluster for data file */
    UINT16      fuptime;            /* File update time */
    UINT16      fupdate;            /* File update */
    UINT16      fclusterlow;        /* Low cluster for data file */
    UINT32      fsize;              /* File size */
	
    /* INTERNAL */
    UINT8       pname[256];  /* Pattern. */
    UINT8       pext[4];
    INT8        path[256];
    void/*DROBJ*/       *pobj;              /* Info for getting at the inode */
    void/*DROBJ*/       *pmom;              /* Info for getting at parent inode */
	
} DSTAT;

typedef struct{
	FILE *fp;
	CHAR filename[MAX_PATH];
}FILEOPENED;

static HANDLE             g_hSearchFile;
static WIN32_FIND_DATA    finddata;
static char               g_chDefaultPath[MAX_PATH] = {0};
static char               g_chDefaultDisk           = 0;
static INT                g_nOpenFiles;
static FILEOPENED         fileopened[MAXOPENFILES];

extern char *GetCurrentWorkPath(void);

/* 将小机文件名转化为PC文件名*/
VOID MakeFileName(UINT8 *pScrFileName,UINT8 *pDstFileName)
{
	char *temp;

	temp = GetCurrentWorkPath();
	
	if(pScrFileName[0] == '/')
	{
		strcpy(pDstFileName,temp);
		strcat(pDstFileName,"\\");
		strcat(pDstFileName,"Flash\\");		
		pDstFileName[strlen(pDstFileName)] = g_chDefaultDisk;
	}
	else if((pScrFileName[1] == ':')/* && (pScrFileName[2] == '/')*/){
		strcpy(pDstFileName,temp);
		strcat(pDstFileName,"\\");
		strcat(pDstFileName,"Flash\\");		
		pDstFileName[strlen(pDstFileName)] = pScrFileName[0];
		strcat(pDstFileName,"\\");

		if(pScrFileName[2] == '/')
			pScrFileName += 3;
		else
			pScrFileName += 2;
	}
	else{
		strcat(pDstFileName,g_chDefaultPath);
		if(pDstFileName[strlen(pDstFileName)-1] != '\\')
			strcat(pDstFileName,"\\");
	}

	while(pScrFileName[0] != 0x00){
		if(pScrFileName[0] == '/'){
			strcat(pDstFileName,"\\");
		}
		else{
			pDstFileName[strlen(pDstFileName)] = pScrFileName[0];
		}

		pScrFileName++;
	}
}

/* 文件模块初始化 */
BOOL FileModInitial() 
{
	g_nOpenFiles    = 0;
	g_chDefaultDisk = 'a';
	g_hSearchFile   = NULL;
	memset(g_chDefaultPath,0,MAX_PATH);
	memset(&finddata,0,sizeof(WIN32_FIND_DATA));
	memset(fileopened,0,sizeof(FILEOPENED)*MAXOPENFILES);

	return TRUE;
}

/* 设置默认磁盘 */
STATUS FileSetDefaultDrive(UINT16 driveno)
{
	g_chDefaultDisk = 'a' + driveno;

	return NU_SUCCESS;
}

/* 获取默认磁盘 */
UINT16 FileGetDefaultDrive(VOID)
{
	return g_chDefaultDisk - 'a';
}

/* 设置当前路径 */
STATUS  FileSetCurrentDir(CHAR *path)
{
	char  name[MAX_PATH];
	DWORD attr;

	memset(name,0,MAX_PATH);
	MakeFileName(path,name);
	attr = GetFileAttributes(name);

	if(attr != (DWORD)-1){
		strcpy(g_chDefaultPath,name);
		return NU_SUCCESS;
	}
	else{
		return NU_FILEERR;
	}
}

/* 获得文件长度 */
INT FileLength(INT fd)
{
	long p;
	long temp;

	temp = ftell((FILE*)fd);
	
	fseek((FILE*)fd,0,SEEK_END);
	p = ftell((FILE*)fd);

	fseek((FILE*)fd,temp,SEEK_SET);

	return p;
}



INT  FileClose(INT fd)
{
	if(fd > 0){
		if(fclose((FILE*)fd) == 0){
			g_nOpenFiles--;
			return NU_SUCCESS;
		}
		else{
			return NU_FILEERR;
		}
	}
	else{
		return NU_FILEERR;
	}
}



/* 打开文件 */
INT FileOpen(UINT8 *pFileName, UINT8 openMode)
{
	char filename[MAX_PATH];
	char flag[5];
	FILE *fp;

	if(g_nOpenFiles >= MAXOPENFILES)return NU_FILEERR;
	
	memset(flag,0,5);
	memset(filename,0,MAX_PATH);
	MakeFileName(pFileName,filename);

	switch(openMode & FILEMODE_MASK){
	case FILEMODE_READONLY:
		strcpy(flag,"rb");
		break;
	case FILEMODE_WRITE:
		strcpy(flag,"wb");
		break;
	case FILEMODE_READWRITE:
		strcpy(flag,"r+b");
		break;
	case FILEMODE_CREATEWRITE:
		strcpy(flag,"w+b");
		break;
	case FILEMODE_APPEND:
		strcpy(flag,"ab");
		break;
	case FILEMODE_NOSHAREWRITE:
		strcpy(flag,"rb");
		break;
	default:
		return -1;
    }

	fp = fopen(filename,flag);

	if(fp == NULL){
		return NU_FILEERR;
	}
	else{
		fileopened[g_nOpenFiles].fp = fp;
		strcpy(fileopened[g_nOpenFiles].filename,filename);
		g_nOpenFiles++;

		return (INT)fp;
	}
}

/* 移动文件指针 */
INT32   FileSeek(INT fd, INT32 offset, INT16 origin)
{
	fseek((FILE*)fd,offset,origin);
	
	return ftell((FILE*)fd);
}

/* 读文件 */
INT32   FileRead(INT fd, CHAR *buf, INT32 count)
{
	return fread(buf,1,count,(FILE*)fd);
}

/* 写文件 */
INT32   FileWrite(INT fd, CHAR *buf, INT32 count)
{
	return fwrite(buf,1,count,(FILE*)fd);
}



/* 文件当前位置重置到开头 */
BOOL FileRewind(INT hFile)
{
	rewind((FILE*)hFile);

    return TRUE;
}


/* 得到文件长度 */
UINT32 FileTell(INT hFile)
{
	return ftell((FILE*)hFile);
}

/* 建立文件夹 */
STATUS  FileMakeDir(CHAR *name)
{
	char filename[MAX_PATH];

	memset(filename,0,MAX_PATH);
	MakeFileName(name,filename);
	
	return mkdir(filename);
}

/* 删除文件夹 */
STATUS  FileRemoveDir(CHAR *name)
{
	char filename[MAX_PATH];

	memset(filename,0,MAX_PATH);
	MakeFileName(name,filename);

	return rmdir(filename);
}

/* 改文件名 */
STATUS  FileRename(CHAR *name, CHAR *newname)
{
	char oldfilename[MAX_PATH],newfilename[MAX_PATH];

	memset(oldfilename,0,MAX_PATH);
	memset(newfilename,0,MAX_PATH);
	MakeFileName(name,oldfilename);
	MakeFileName(newname,newfilename);

	return rename(oldfilename,newfilename);
}

/* 删除文件 */
STATUS  FileDelete(CHAR *name)
{
	char filename[MAX_PATH];

	memset(filename,0,MAX_PATH);
	MakeFileName(name,filename);

	return remove(filename);
}

/* 设置文件属性 */
STATUS  FileSetAttributes(CHAR *name, UINT8 newattr)
{
	char               filename[MAX_PATH];
	unsigned long      dwRes;

	memset(filename,0,MAX_PATH);
	MakeFileName(name,filename);

	dwRes = SetFileAttributes(filename,(DWORD)newattr);

	return dwRes;
}

/* 获取文件属性 */
STATUS FileGetAttributes(UINT8 *attr, CHAR *name)
{
	char   filename[MAX_PATH];
	DWORD  attrib;

	memset(filename,0,MAX_PATH);
	MakeFileName(name,filename);

	attrib = GetFileAttributes(filename);
	*attr  = (UINT8)attrib;

	if(attrib == (DWORD)-1){
		return NU_FILEERR;
	}
	else{
		return NU_SUCCESS;
	}
}

/* 查找第一个文件 */
STATUS  FileGetFirst(DSTAT *statobj, CHAR *pattern)
{
	char name[MAX_PATH];
	char *temp;
	char *filename;

	memset(name,0,MAX_PATH);
	MakeFileName(pattern,name);

	g_hSearchFile = FindFirstFile(name,&finddata);

	if(g_hSearchFile != INVALID_HANDLE_VALUE){
		memset(statobj,0,sizeof(DSTAT));
		statobj->fsize      = finddata.nFileSizeLow;
		statobj->fattribute = (UINT8)finddata.dwFileAttributes;
		strcpy(statobj->lfname,finddata.cFileName);

		memset(statobj->sfname,0x20,8);
		memset(statobj->fext,0x20,3);
		if(finddata.cAlternateFileName[0] == '\0'){
			filename = finddata.cFileName;
		}
		else{
			filename = finddata.cAlternateFileName;
		}
		temp = filename + strlen(filename);
		while((temp[0] != '.') && (temp > filename))temp--;
		if(temp[0] == '.'){
			strcpy(statobj->fext,temp+1);
			memcpy(statobj->sfname,filename,temp - filename);
		}
		else{
			memcpy(statobj->sfname,filename,strlen(filename));
		}
		
		return NU_SUCCESS;
	}
	else{
		return NU_FILEERR;
	}
}

/* 查找下一个文件 */
INT  FileGetNext(DSTAT *statobj)
{
	BOOL res;
	char *temp;
	char *filename;

	res = FindNextFile(g_hSearchFile,&finddata);

	if(res){
		memset(statobj,0,sizeof(DSTAT));
		statobj->fattribute = (UINT8)finddata.dwFileAttributes;
		strcpy(statobj->lfname,finddata.cFileName);
		
		memset(statobj->sfname,0x20,8);
		memset(statobj->fext,0x20,3);
		if(finddata.cAlternateFileName[0] == '\0'){
			filename = finddata.cFileName;
		}
		else{
			filename = finddata.cAlternateFileName;
		}
		temp = filename + strlen(filename);
		while((temp[0] != '.') && (temp > filename))temp--;
		if(temp[0] == '.'){
			strcpy(statobj->fext,temp+1);
			memcpy(statobj->sfname,filename,temp - filename);
		}
		else{
			memcpy(statobj->sfname,filename,strlen(filename));
		}
		
		return NU_SUCCESS;
	}
	else{
		return NU_FILEERR;
	}
}

/* 结束查找文件 */
VOID FileDone(DSTAT *statobj)
{
	g_hSearchFile = INVALID_HANDLE_VALUE;
	memset(&finddata,0,sizeof(WIN32_FIND_DATA));
    FindClose(g_hSearchFile);
}

/* 获取磁盘空间 */
STATUS  FileFreeSpace(CHAR *path, UINT8 *secpcluster, UINT16 *bytepsec, UINT32 *freecluster, UINT32 *totalcluster)
{
	*bytepsec     = (UINT16)FLASH_BLOCK_DATASIZE;
	*totalcluster = FLASH_BLOCK_USER;
	*secpcluster  = 1;
	*freecluster  = *totalcluster;
	
	return NU_SUCCESS;
}

//INT  NU_Become_File_User (VOID);
//VOID NU_Release_File_User(VOID);
INT FileBecomeFileUser(VOID)
{
	return 1;
//    return NU_Become_File_User();
}

VOID FileReleaseFileUser(VOID)
{
//    NU_Release_File_User();
}

/* 截取文件 */
STATUS  FileTruncate(INT fd, INT32 offset)
{
	CHAR *buffer;
	CHAR filename[MAX_PATH];
	INT  i;
	long len;
	FILE *fp;

	for(i = 0;i < g_nOpenFiles;i++){
		if(fd == (INT)fileopened[i].fp){
			strcpy(filename,fileopened[i].filename);
			break;
		}
	}

	if(i >= g_nOpenFiles)return NU_FILEERR;

	len = FileLength(fd);

	if(len < offset){
		return NU_FILEERR;
	}
	else if(len == offset){
		return NU_SUCCESS;
	}

	fclose((FILE*)fd);

	fp = fopen(filename,"rb");
	if(fp == NULL){
		return NU_FILEERR;
	}

	buffer = (CHAR*)malloc(offset);
	if(buffer == NULL)return NU_FILEERR;

	fread(buffer,1,offset,(FILE*)fd);
	fclose((FILE*)fd);

	fd = (INT)fopen(filename,"w+b");
	if(fd == NULL){
		free(buffer);
		return NU_FILEERR;
	}

	fwrite(buffer,1,offset,(FILE*)fd);
	
	free(buffer);
	
    return NU_SUCCESS;
}

/* 判断SD卡是否插入 */
BOOL IsCardExist(VOID)
{
	return FALSE;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?