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 + -
显示快捷键?