【求助】读写U盘文件的问题,原来读写正确,增加读文件创建时间后不正确了

这是读写文件的一部分,这部分在我增加读另一个文件的创建时间之前还能够正确读写, 但是增加了读另外个文件的创建时间(该文件是有创建时间的)后,就不正确了,在创建这个文件时,第一行多出了文件名和几个乱码,在后面追加数据都是正确的,但是就是第一行出错,出现了 OPEN.TXT PX 080307145010 080307145010 080307145016 080307145016 正确的应该为 080307145010 080307145010 080307145016 080307145016 .... 下面是写这个文件OPEN.TXT的部分代码 void WriteOpen(unsigned char flag) //flag为开机时间OPEN_TIME还是关机时间CLOSE_TIME { UINT8 i; UINT8 temp[12]; unsigned int year; unsigned char month,day,hour,minute,second; strcpy( (char *)mCmdParam.Open.mPathName, "/OPEN.TXT" ); /* 文件名,该文件在根目录下 */ i=CH375FileOpen( ); /* 打开文件 */ if(i==ERR_MISS_FILE)//如果没有文件,创建文件 { strcpy((char *)mCmdParam.Create.mPathName, "/OPEN.TXT"); /* 文件名 */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); } mCmdParam.ByteLocate.mByteOffset = 0xffffffff; //移到文件的尾部 CH375ByteLocate( ); mCmdParam.ByteWrite.mByteCount = 27; //写入27个字节的数据 mCmdParam.ByteWrite.mByteBuffer[12]='\t'; for(i=0;i<12;i++) { mCmdParam.ByteWrite.mByteBuffer[i] = temp[i];//temp[i]中保存的是要写入的字符 mCmdParam.ByteWrite.mByteBuffer[i+13] = temp[i]; } mCmdParam.ByteWrite.mByteBuffer[25]=0x0D; mCmdParam.ByteWrite.mByteBuffer[26]=0x0A; CH375ByteWrite( ); mCmdParam.Close.mUpdateLen = 1; i = CH375FileClose( ); mStopIfError( i );

新增加的读另一个文件的创建时间的程序如下: void GetCreatTimeFromFDT(void) { UINT8 i,j; UINT16 StepNum=sizeof(P_FAT_DIR_INFO),Step; PUINT8 NameBuf; UINT8 tempName[11]; UINT8 Dir_CrtTimeTeenth; //文件创建时间秒数 UINT16 Dir_CrtTime,Dir_CrtDate;//文件创建时间和日期 unsigned int tempyear; NameBuf=tempName; CreatTimeFromFDT.second= 0; CreatTimeFromFDT.minute= 0; CreatTimeFromFDT.hour = 0; CreatTimeFromFDT.day = 0; CreatTimeFromFDT.month = 0; CreatTimeFromFDT.year = 0; strcpy((char *)mCmdParam.Open.mPathName, "/PDEVICE.TXT" ); i=CH375FileOpen( ); /* 打开文件 */ mStopIfError( i );

//打开文件成功后,DISK_BASE_BUF中存放了FDT信息 for(Step=0;Step{ //FDT表前11byte是文件名 NameBuf[ 0 ]=DISK_BASE_BUF[ Step + 0 ]; NameBuf[ 1 ]=DISK_BASE_BUF[ Step + 1 ]; NameBuf[ 2 ]=DISK_BASE_BUF[ Step + 2 ]; NameBuf[ 3 ]=DISK_BASE_BUF[ Step + 3 ]; NameBuf[ 4 ]=DISK_BASE_BUF[ Step + 4 ]; NameBuf[ 5 ]=DISK_BASE_BUF[ Step + 5 ]; NameBuf[ 6 ]=DISK_BASE_BUF[ Step + 6 ]; NameBuf[ 7 ]=DISK_BASE_BUF[ Step + 7 ]; NameBuf[ 8 ]=DISK_BASE_BUF[ Step + 8 ]; NameBuf[ 9 ]=DISK_BASE_BUF[ Step + 9 ]; NameBuf[ 10]=DISK_BASE_BUF[ Step + 10]; if(memcmp( "PDEVICE",NameBuf,7)==0 && NameBuf[ 8 ]=='T'&& NameBuf[ 9 ]=='X'&& NameBuf[ 10]=='T') //文件名匹配 { Dir_CrtTimeTeenth= DISK_BASE_BUF[ Step + 13 ]; Dir_CrtTime = DISK_BASE_BUF[ Step + 14 ] | DISK_BASE_BUF[ Step + 15 ]<<8; Dir_CrtDate = DISK_BASE_BUF[ Step + 16 ] | DISK_BASE_BUF[ Step + 17 ]<<8; CreatTimeFromFDT.second= ( ( (UINT8)( ((Dir_CrtTime )&0x1F) /10) )<<4 )|( ((UINT8)( (Dir_CrtTime )&0x1F) %10) );

if( Dir_CrtTimeTeenth >= 100 && Dir_CrtTimeTeenth < 200 ) CreatTimeFromFDT.second++; CreatTimeFromFDT.minute= ( ( ((UINT8)( (Dir_CrtTime>>5 )&0x3F) /10) )<<4 )|( ((UINT8)( (Dir_CrtTime>>5 )&0x3F) %10) ); CreatTimeFromFDT.hour = ( ( ((UINT8)( (Dir_CrtTime>>11)&0x1F) /10) )<<4 )|( ((UINT8)( (Dir_CrtTime>>11)&0x1F) %10) ); CreatTimeFromFDT.day = ( ( ((UINT8)( (Dir_CrtDate )&0x1F) /10) )<<4 )|( ((UINT8)( (Dir_CrtDate )&0x1F) %10) ); CreatTimeFromFDT.month = ( ( ((UINT8)( (Dir_CrtDate>>5 )&0x0F) /10) )<<4 )|( ((UINT8)( (Dir_CrtDate>>5 )&0x0F) %10) ); tempyear=(Dir_CrtDate>>9 )&0x7F-20;//1980-2000 CreatTimeFromFDT.year = ( ( (UINT8)( tempyear /10) )<<4 )|( (UINT8)( tempyear %10) ); break; } 请问这是这是怎么一会事呢? } mCmdParam.Close.mUpdateLen = 0; //不更新文件长度 i = CH375FileClose( ); mStopIfError( i ); }

在创建文件之前先清除下DISK_BASE_BUF在进行创建


还是不行啊,我在创建文件前面增加了 CH375DirtyBuffer( );还是不行 现在的代码如下: strcpy( (char *)mCmdParam.Open.mPathName, "/OPEN.TXT" ); /* 文件名,该文件在根目录下 */ i=CH375FileOpen( ); /* 打开文件 */ if(i==ERR_MISS_FILE)//如果没有文件,创建文件 { CH375DirtyBuffer( ); //清除DISK_BASE_BUF strcpy((char *)mCmdParam.Create.mPathName, "/OPEN.TXT"); /* 文件名 */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); }


那这样测试下看可以不可以,在你创建完文件之后直接关闭文件,自动更新文件长度,看下这个时候,文件里面是否还有数据存在。


有数据,就是前面多了的那段数据OPEN.TXT $&X 我用winhex查看文件该文件的内容为:前面的正好是文件名,最后的数字正好就是系统当前时间(系统含有实时时钟模块)。4F50454E2E545854000000000000000000000000000000000000000000000000000000080307162426580000000000


程序这样操作: if(i==ERR_MISS_FILE)//如果没有文件,创建文件 { strcpy((char *)mCmdParam.Create.mPathName, "/OPEN.TXT"); /* 文件名 */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); } else if(i==0x00){ mCmdParam.ByteLocate.mByteOffset = 0xffffffff; //移到文件的尾部 CH375ByteLocate( ); } 这样操作就应该没有问题了。


还是不行啊,还是这样的OPEN.TXT UX


那你这样,不打开文件,直接创建文件往里面写数据,然后在直接的关闭文件,看下这里面还有没有这个数据


有,还是那些数据;OPEN.TXT 0X


那文件的属性里面的大小是多少?你可以用CH375FileModify这个函数将长度强制更新为1,然后在去看下还有没有


这样就没有了 但是strcpy((char *)mCmdParam.Create.mPathName, "/OPEN.TXT"); /* 文件名 */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); mCmdParam.Modify.mFileAttr = 0xff; /* 输入参数: 新的文件属性,为0FFH则不修改 */ mCmdParam.Modify.mFileTime = MAKE_FILE_TIME( hour, minute, second ); /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( year, month, day ); /* 输入参数: 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = 1; /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */ i = CH375FileModify( ); /* 修改当前文件的信息,修改日期和长度 */ mStopIfError( i ); mCmdParam.Close.mUpdateLen = 0; i = CH375FileClose( ); mStopIfError( i ); 在这之后重新打开写入数据的话,那段还是有的,如果不写入的话,那些没有了,文件长度为1字节


现在可以肯定的是,创建文件的时候造成的,我把创建文件那部分给屏蔽掉以后,没问题了! 但是怎样才能创建文件,而又不出问题呢?


那要是这样的话,有一种避免的办法就是在你创建好文件之后强制更新文件长度为1,然后在打开文件写文件就可以了。


我现在是创建后,把长度设为0(如果设为1的话,文件第一个字符是'.'),重新打开文件,在这之前通过串口查看各个变量还是正确的,但是后面给 mCmdParam.ByteWrite.mByteBuffer赋值后,通过串口把值发送上来,里面根本不是我设定的值,而且其他字符也都传不上来,例如printf("write open time %c%c\n",mCmdParam.ByteWrite.mByteBuffer[0],mCmdParam.ByteWrite.mByteBuffer[1]);。根本得不到值,就连前面的“write open time ” 都接收不到,要是文件已经创建,再后面添加的话,都没问题了,一切都OK了。我不知道这是什么原因早成的,难道是创建后mCmdParam.ByteWrite.mByteBuffer不对了,可是我用同样的办法创建其他文件都没问题啊。


只有登录才能回复,可以选择微信账号登录