file.c
来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 1,866 行 · 第 1/5 页
C
1,866 行
/****************************************************************************/
/* */
/* Copyright (C) 2002 SHENZHEN MEIJIN CO.LTD */
/* */
/* FILE NAME: FileTemp.C */
/* MODULE NAME: FILE MOD */
/* DESCRIPTION: 文件系统临时源文件 */
/* */
/****************************************************************************/
/* DATE AUTHOR VERSION REMARKS */
/* =========== =========== ========= =====================================*/
/* 2002-10-11 谢永良 Ver 1.00 创建 */
/****************************************************************************/
#define __OS_SOURCE_FILE__
#include "Kernel.h"
#include "romfile.h"
//#include "SysWatch.h"
//#define FILE_TEST 1
//#define FILE_TASK_TEST 1
//#define FILE_SPEED_TEST 1
#define WDCOUNTER (10*1000)
// 全局变量定义
_PC_BDEVSW pc_bdevsw[NDRIVES]; //磁盘设备驱动表
INT NUF_Drive_Fat_Size[NDRIVES]; //Fat表大小表
/* Dummy device */
INT nodev_open(UINT16 driveno) { return(NO); }
INT nodev_raw_open(UINT16 driveno) { return(NO); }
INT nodev_close(UINT16 driveno) { return(NO); }
INT nodev_io(UINT16 driveno, UINT32 sector, VOID FAR *buffer, UINT16 count, INT reading) { return(NO); }
INT nodev_ioctl(UINT16 driveno, UINT16 command, VOID *buffer) { return(NO); }
INT nodev_chk_proc(UINT16 driveno) { return(NU_INVALID_DRIVER); }
INT FileInitialize()
{
return pc_memory_init();
}
BOOL FileModInitial()
{
INT i;
_PC_BDEVSW dtTemp;
OPTION preempt_status;
dtTemp.lock_no = 0;
dtTemp.open_proc = nodev_open;
dtTemp.raw_open_proc = nodev_raw_open;
dtTemp.close_proc = nodev_close;
dtTemp.io_proc = nodev_io;
dtTemp.ioctl_proc = nodev_ioctl;
dtTemp.dskchk_proc = nodev_chk_proc;
for( i = 0; i < NDRIVES; i++ )
{
dtTemp.lock_no = i;
memmove(&pc_bdevsw[i], &dtTemp, sizeof(_PC_BDEVSW));
}
for( i = 0; i < NDRIVES; i++ )
NUF_Drive_Fat_Size[i] = 0;
/* Disable time slice until ramdisk is set up */
preempt_status = NU_Change_Preemption(NU_NO_PREEMPT);
if( !FileInitialize() )
return FALSE;
if (!romFileInitial() )
return FALSE;
/* Enable time slice */
NU_Change_Preemption(preempt_status);
/* return(status); */
return TRUE;
}
/* 下面这个函数由谢永良增加 2003.3.20 */
/* 设置本机的磁盘设备相关参数表 */
BOOL FileSetDeviceDispatchTable(INT nNo, _PC_BDEVSW *pDevDt, INT nFatSize)
{
if( (nNo < 0) || (nNo >= NDRIVES) )
return FALSE;
memmove(&pc_bdevsw[nNo], pDevDt, sizeof(_PC_BDEVSW) );
NUF_Drive_Fat_Size[nNo] = nFatSize;
return TRUE;
}
extern BOOL FlashUpdate(VOID);
BOOL FileFlashUpdate(void)
{
PC_FS_ENTER()
CHECK_USER(INT, NUF_BAD_USER)
PC_DRIVE_ENTER(NFLASH_DRIVENO, YES)
PC_DRIVE_IO_ENTER(NFLASH_DRIVENO)
FlashUpdate();
PC_DRIVE_IO_EXIT(NFLASH_DRIVENO)
PC_DRIVE_EXIT(NFLASH_DRIVENO)
PC_FS_EXIT()
return TRUE;
}
STATUS FileOpenDisk(CHAR *path)
{
return NU_Open_Disk(path);
}
INT FileCloseDisk(CHAR *path)
{
return NU_Close_Disk(path);
}
VOID FileDiskAbort(CHAR *path)
{
NU_Disk_Abort(path);
}
STATUS FileMakeDir(CHAR *name)
{
STATUS val;
//if(SysGetLowVoltageStatus() == TRUE){
// return NUF_BATTERYLOW;
//}
SysWatchEnd();
val = NU_Make_Dir(name);
FileFlashUpdate();
SysWatchStart(WDCOUNTER);
return val;
}
INT FileSOpen(CHAR *name, UINT16 flag, UINT16 mode)
{
if((flag & PO_WRONLY) == PO_WRONLY || (flag & (PO_CREAT | PO_RDWR)) == (PO_CREAT | PO_RDWR)){
//if(SysGetLowVoltageStatus() == TRUE){
// return NUF_BATTERYLOW;
//}
}
return NU_Open(name, flag, mode);
}
INT FileLength(INT fd)
{
INT32 val;
SysWatchEnd();
if (isRomFileHandle(fd))
{
val = romFileLength(fd);
}
else
{
val = NU_Length(fd);
}
SysWatchStart(WDCOUNTER);
return val;
}
STATUS FileGetAttributes(UINT8 *attr, CHAR *name)
{
return NU_Get_Attributes(attr, name);
}
VOID FileDone(DSTAT *statobj)
{
NU_Done(statobj);
}
STATUS FileSetDefaultDrive(UINT16 driveno)
{
return NU_Set_Default_Drive(driveno);
}
UINT16 FileGetDefaultDrive(VOID)
{
return NU_Get_Default_Drive();
}
STATUS FileCurrentDir(UINT8 *drive, CHAR *path)
{
return NU_Current_Dir(drive, path);
}
INT FileBecomeFileUser(VOID)
{
return NU_Become_File_User();
}
VOID FileReleaseFileUser(VOID)
{
NU_Release_File_User();
}
INT FileCheckFileUser(VOID)
{
return NU_Check_File_User();
}
VOID FileTerminate(VOID)
{
pc_memory_close();
}
STATUS FileTruncate(INT fd, INT32 offset)
{
STATUS val;
//if(SysGetLowVoltageStatus() == TRUE){
// return NUF_BATTERYLOW;
//}
SysWatchEnd();
val = NU_Truncate(fd, offset);
FileFlashUpdate();
SysWatchStart(WDCOUNTER);
return val;
}
STATUS FileFlush(INT fd)
{
STATUS val;
//if(SysGetLowVoltageStatus() == TRUE){
// return NUF_BATTERYLOW;
//}
SysWatchEnd();
val = NU_Flush(fd);
FileFlashUpdate();
SysWatchStart(WDCOUNTER);
return val;
}
STATUS FileClose(INT fd)
{
STATUS val;
SysWatchEnd();
if (isRomFileHandle(fd))
{
val = romFileClose(fd);
}
else
{
val = NU_Close(fd);
}
FileFlashUpdate();
SysWatchStart(WDCOUNTER);
return val;
}
STATUS FileSetAttributes(CHAR *name, UINT8 newattr)
{
STATUS val;
//if(SysGetLowVoltageStatus() == TRUE){
// return NUF_BATTERYLOW;
//}
SysWatchEnd();
val = NU_Set_Attributes(name, newattr);
FileFlashUpdate();
SysWatchStart(WDCOUNTER);
return val;
}
STATUS FileRename(CHAR *name, CHAR *newname)
{
STATUS val;
//if(SysGetLowVoltageStatus() == TRUE){
// return NUF_BATTERYLOW;
//}
SysWatchEnd();
val = NU_Rename(name, newname);
FileFlashUpdate();
SysWatchStart(WDCOUNTER);
return val;
}
STATUS FileDelete(CHAR *name)
{
STATUS val;
//if(SysGetLowVoltageStatus() == TRUE){
// return NUF_BATTERYLOW;
//}
SysWatchEnd();
val = NU_Delete(name);
FileFlashUpdate();
SysWatchStart(WDCOUNTER);
return val;
}
STATUS FileRemoveDir(CHAR *name)
{
STATUS val;
//if(SysGetLowVoltageStatus() == TRUE){
// return NUF_BATTERYLOW;
//}
SysWatchEnd();
val = NU_Remove_Dir(name);
FileFlashUpdate();
SysWatchStart(WDCOUNTER);
return val;
}
STATUS FileFormat(INT16 driveno, FMTPARMS *pfmt)
{
STATUS val;
//if(SysGetLowVoltageStatus() == TRUE){
// return NUF_BATTERYLOW;
//}
SysWatchEnd();
val = NU_Format(driveno, pfmt);
FileFlashUpdate();
SysWatchStart(WDCOUNTER);
return val;
}
/* 打开文件 */
INT FileOpen(UINT8 *pFileName, UINT8 openMode)
{
UINT16 flag;
INT val;
if (pFileName == NULL)
return -1;
if(((pFileName[0] == 'c' || pFileName[0] == 'C') && pFileName[1] == ':' && pFileName[2] == '/') ||
((pFileName[0] == 'd' || pFileName[0] == 'D') && pFileName[1] == ':' && pFileName[2] == '/')){
return romFileOpen(pFileName,openMode);
}
switch(openMode & FILEMODE_MASK){
case FILEMODE_READONLY:
flag = PO_RDONLY;
break;
case FILEMODE_WRITE:
flag = PO_WRONLY;
break;
case FILEMODE_READWRITE:
flag = PO_RDWR ;
break;
case FILEMODE_CREATEWRITE:
flag = PO_CREAT | PO_RDWR;
break;
case FILEMODE_APPEND:
flag = PO_APPEND;
break;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?