file.c

来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 1,866 行 · 第 1/5 页

C
1,866 行
字号
        case FILEMODE_NOSHAREWRITE:     /*不允许其他人共享写文件,黄小明为Mp3增加的,2003/7/21*/
            flag = PO_NOSHAREWRITE;
            break;
        default:
            return -1;
    }

    SysWatchEnd();
    val = FileSOpen((CHAR*)pFileName, flag, PS_IWRITE);
    SysWatchStart(WDCOUNTER);

    return val;
}

STATUS  FileSetCurrentDir(CHAR *path)
{
    STATUS val;

    SysWatchEnd();
    val = NU_Set_Current_Dir(path);
    SysWatchStart(WDCOUNTER);

    return val;
}

STATUS  FileGetNext(DSTAT *statobj)
{
    STATUS val;

    SysWatchEnd();
    val = NU_Get_Next(statobj);
    SysWatchStart(WDCOUNTER);

    return val;
}

STATUS  FileGetFirst(DSTAT *statobj, CHAR *pattern)
{
    STATUS val;

    SysWatchEnd();
    val = NU_Get_First(statobj, pattern);
    SysWatchStart(WDCOUNTER);

    return val;
}

INT FileIniFreeSpace(INT16 driveno)
{
    INT val;

    SysWatchEnd();
    val = NU_IniFreeSpace(driveno);
    SysWatchStart(WDCOUNTER);

    return val;
}

INT FileGetFreeSpace(INT16 driveno)
{
    INT val;

    SysWatchEnd();
    val = NU_GetFreeSpace(driveno);
    SysWatchStart(WDCOUNTER);

    return val;
}

VOID FileSetFreeSpace(INT16 driveno, INT size)
{
    SysWatchEnd();
    NU_SetFreeSpace(driveno, size);
    SysWatchStart(WDCOUNTER);
}

STATUS  FileFreeSpace(CHAR *path, UINT8 *secpcluster, UINT16 *bytepsec, UINT32 *freecluster, UINT32 *totalcluster)
{
    STATUS val;

    SysWatchEnd();
    val = NU_FreeSpace(path, secpcluster, bytepsec, freecluster, totalcluster);
    SysWatchStart(WDCOUNTER);

    return val;
}

INT32   FileSeek(INT fd, INT32 offset, INT16 origin)
{
    INT32 val;

    SysWatchEnd();
    if (isRomFileHandle(fd))
    {
        val = romFileSeek(fd, offset, origin);
    }
    else
    {
        val = NU_Seek(fd, offset, origin);
    }
    SysWatchStart(WDCOUNTER);

    return val;
}

INT32   FileRead(INT fd, CHAR *buf, INT32 count)
{
    INT32 val;

    SysWatchEnd();
    if (isRomFileHandle(fd))
    {
        val = romFileRead(fd, buf, count);
    }
    else
    {
        val = NU_Read(fd, buf, count);
    }
    SysWatchStart(WDCOUNTER);

    return val;
}

INT32   FileWrite(INT fd, CHAR *buf, INT32 count)
{
    UINT32	dwFreeSpace;
    UINT32	dwFreecluster, dwTotalcluster;
    UINT8	secpcluster; 
    UINT16	wBytepsec;
    UINT32  temp1, temp2;

    //if(SysGetLowVoltageStatus() == TRUE){
    //    return NUF_BATTERYLOW;
    //}

    SysWatchEnd();
    temp1 = FileSeek(fd, 0, PSEEK_CUR);
    temp2 = FileSeek(fd, 0, PSEEK_END);
    temp2 -= temp1;
    FileSeek(fd, temp1, PSEEK_SET);
    if(count <= (INT32)temp2){   // enough space
        temp1 = NU_Write(fd, buf, count);
        FileFlashUpdate();
        SysWatchStart(WDCOUNTER);
        return temp1;
    }

    if(NU_Fd2Drv(fd) == 0){
        FileFreeSpace("A:", &secpcluster, &wBytepsec,&dwFreecluster, &dwTotalcluster);
        dwFreeSpace = (UINT32)secpcluster * wBytepsec * dwFreecluster + temp2;
        if (dwFreeSpace < (UINT32)count)
        {
            SysWatchStart(WDCOUNTER);
            return NUF_NOSPC;
        }
        temp1 = NU_Write(fd, buf, count);
        FileFlashUpdate();
    }else{
        temp1 = NU_Write(fd, buf, count);
    }

    SysWatchStart(WDCOUNTER);
    return temp1;
}

STATUS FileAllFormat(void)
{
    STATUS val;

    //if(SysGetLowVoltageStatus() == TRUE){
    //    return NUF_BATTERYLOW;
    //}

    SysWatchEnd();

    if(FlashIoCtrl(NFLASH_DRIVENO, FLASH_COMMAND_FORMAT, NULL) < 0){
        SysWatchStart(WDCOUNTER);
        return NUF_IO_ERROR;
    }

    val = FileDiskFormat();
    
    FileFlashUpdate();
    SysWatchStart(WDCOUNTER);

    return val;
}


/* 文件当前位置重置到开头 */
BOOL FileRewind(INT hFile)
{
    SysWatchEnd();
    FileSeek(hFile, 0, PSEEK_SET);
    SysWatchStart(WDCOUNTER);

    return TRUE;
}

/* 得到文件长度 */
/* victor delete for quickly call 
UINT32 FileLength(INT hFile)
{
    UINT32 temp, ret;
    
    temp = FileSeek(hFile, 0, PSEEK_CUR);
    ret = FileSeek(hFile, 0, PSEEK_END);
    FileSeek(hFile, temp, PSEEK_SET);
    return ret;
}*/

/* 得到文件长度 */
UINT32 FileTell(INT hFile)
{
    return FileSeek(hFile, 0, PSEEK_CUR);
}

/* ******************************************** */

DATESTR *pc_getsysdate(DATESTR *pd)
{
/*
UINT16      year;       // relative to 1980
UINT16      month;      // 1 - 12
UINT16      day;        // 1 - 31 
UINT16      hour;
UINT16      minute;
UINT16      sec;        // Note: seconds are 2 second/per. ie 3 == 6 seconds
UINT8       cenmsec;

    // This code is useless but very generic
    // Hardwire for now
    // 7:37:28 PM
    hour = 19;
    minute = 37;
    sec = 14;
    // 3-28-88
    year = 8;       // relative to 1980
    month = 3;      // 1 - 12
    day = 28;       // 1 - 31
    cenmsec = 0;    // 0 - 99
    
    pd->cmsec = cenmsec;
    pd->time = (UINT16) ( (hour << 11) | (minute << 5) | sec );
    pd->date = (UINT16) ( (year << 9) | (month << 5) | day );
*/
//DateTimeType    datatime;
//UINT32          seconds;

    //seconds = TimGetSeconds();
    //TimSecondsToDateTime(seconds, &datatime);

    //datatime.year -= 1980;
    //datatime.second >>= 1;

    pd->cmsec = 0;
    pd->time = (UINT16) 0; //( (datatime.hour << 11) | (datatime.minute << 5) | datatime.second );
    pd->date = (UINT16) 0; //( (datatime.year << 9) | (datatime.month << 5) | datatime.day );
    return(pd);
}

/*************************************************************************
    Function   : FileOpenCheckStart
    Description: debug for check file open/close is macth

    Input:
    
    Output:
      
    Return:

      DATE      AUTHOR   VERSION  REMARKS
========================================================================== 
    2002-09-26  谢永良     1.0     create
**************************************************************************/

#define DEBUG_CKECK_LAYERS      6   // 检查层数

extern PC_FILE  *mem_file_pool;
static UINT32   g_dwFOpenCheckPtr[DEBUG_CKECK_LAYERS+1];
static int      g_nFOpenCheckLayer = 0;

void FileOpenCheckStart(void)
{
    UINT32      dwOpen;
    int         i;
    OPTION      opPreemptStatus;
    
    opPreemptStatus = NU_Change_Preemption(NU_NO_PREEMPT);
    
    if (g_nFOpenCheckLayer < DEBUG_CKECK_LAYERS)
    {
        dwOpen = 0;
        for (i = 0; i < NUSERFILES; i++)
        {   // 注意:NUSERFILES 必须小于32
            if (!mem_file_pool[i].is_free)
            {
                /*如果是后台播放使用的文件,不接受检查,黄小明为Mp3增加的,2003/9/11*/
                if (mem_file_pool[i].pobj->finode->openflags & 0x80)
                {
                    continue;
                }
                else
                {
                    dwOpen |= (1 << i);
                }
            }
        }
        g_dwFOpenCheckPtr[g_nFOpenCheckLayer++] = dwOpen;
    }

    NU_Change_Preemption(opPreemptStatus);
}

/*************************************************************************
    Function   : FileOpenCheckEnd
    Description: debug for check file open/close is macth

    Input:
    
    Output:
      
    Return:

      DATE      AUTHOR   VERSION  REMARKS
========================================================================== 
    2002-09-26  谢永良     1.0     create
**************************************************************************/

void FileOpenCheckEnd(void)
{
    UINT32      dwOpen;
    int         i;
    OPTION      opPreemptStatus;
    
    opPreemptStatus = NU_Change_Preemption(NU_NO_PREEMPT);
    
    if (g_nFOpenCheckLayer > 0)
    {
        g_nFOpenCheckLayer--;
        
        dwOpen = 0;
        for (i = 0; i < NUSERFILES; i++)
        {   // 注意:NUSERFILES 必须小于32
            if (!mem_file_pool[i].is_free)
            {
                /*如果是后台播放使用的文件,不接受检查,黄小明为Mp3增加的,2003/9/11*/
                if (mem_file_pool[i].pobj->finode->openflags & 0x80)
                {
                    continue;
                }
                else
                {
                    dwOpen |= (1 << i);
                }
            }
        }

        if (g_dwFOpenCheckPtr[g_nFOpenCheckLayer] != dwOpen)
        {   // 检查到不一致
            UINT32  dwTemp;

            dwTemp = (g_dwFOpenCheckPtr[g_nFOpenCheckLayer] ^ dwOpen);
            for (i = 0; i < NUSERFILES; i++)
            {
                if (dwTemp & (1 << i))
                {
                    break;
                }
            }

            if (i < NUSERFILES)
            {
                if (dwOpen & (1 << i))

⌨️ 快捷键说明

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