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