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