【求助】讀寫U盤文件的問題,原來讀寫正確,增加讀文件創(chuàng)建時間后不正確了

這是讀寫文件的一部分,這部分在我增加讀另一個文件的創(chuàng)建時間之前還能夠正確讀寫, 但是增加了讀另外個文件的創(chuàng)建時間(該文件是有創(chuàng)建時間的)后,就不正確了,在創(chuàng)建這個文件時,第一行多出了文件名和幾個亂碼,在后面追加數(shù)據(jù)都是正確的,但是就是第一行出錯,出現(xiàn)了 OPEN.TXT PX 080307145010 080307145010 080307145016 080307145016 正確的應該為 080307145010 080307145010 080307145016 080307145016 .... 下面是寫這個文件OPEN.TXT的部分代碼 void WriteOpen(unsigned char flag) //flag為開機時間OPEN_TIME還是關(guān)機時間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)//如果沒有文件,創(chuàng)建文件 { strcpy((char *)mCmdParam.Create.mPathName, "/OPEN.TXT"); /* 文件名 */ i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); } mCmdParam.ByteLocate.mByteOffset = 0xffffffff; //移到文件的尾部 CH375ByteLocate( ); mCmdParam.ByteWrite.mByteCount = 27; //寫入27個字節(jié)的數(shù)據(jù) 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 );

新增加的讀另一個文件的創(chuàng)建時間的程序如下: void GetCreatTimeFromFDT(void) { UINT8 i,j; UINT16 StepNum=sizeof(P_FAT_DIR_INFO),Step; PUINT8 NameBuf; UINT8 tempName[11]; UINT8 Dir_CrtTimeTeenth; //文件創(chuàng)建時間秒數(shù) UINT16 Dir_CrtTime,Dir_CrtDate;//文件創(chuàng)建時間和日期 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 ); }

在創(chuàng)建文件之前先清除下DISK_BASE_BUF在進行創(chuàng)建


還是不行啊,我在創(chuàng)建文件前面增加了 CH375DirtyBuffer( );還是不行 現(xiàn)在的代碼如下: strcpy( (char *)mCmdParam.Open.mPathName, "/OPEN.TXT" ); /* 文件名,該文件在根目錄下 */ i=CH375FileOpen( ); /* 打開文件 */ if(i==ERR_MISS_FILE)//如果沒有文件,創(chuàng)建文件 { CH375DirtyBuffer( ); //清除DISK_BASE_BUF strcpy((char *)mCmdParam.Create.mPathName, "/OPEN.TXT"); /* 文件名 */ i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); }


那這樣測試下看可以不可以,在你創(chuàng)建完文件之后直接關(guān)閉文件,自動更新文件長度,看下這個時候,文件里面是否還有數(shù)據(jù)存在。


有數(shù)據(jù),就是前面多了的那段數(shù)據(jù)OPEN.TXT $&X 我用winhex查看文件該文件的內(nèi)容為:前面的正好是文件名,最后的數(shù)字正好就是系統(tǒng)當前時間(系統(tǒng)含有實時時鐘模塊)。4F50454E2E545854000000000000000000000000000000000000000000000000000000080307162426580000000000


程序這樣操作: if(i==ERR_MISS_FILE)//如果沒有文件,創(chuàng)建文件 { strcpy((char *)mCmdParam.Create.mPathName, "/OPEN.TXT"); /* 文件名 */ i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); } else if(i==0x00){ mCmdParam.ByteLocate.mByteOffset = 0xffffffff; //移到文件的尾部 CH375ByteLocate( ); } 這樣操作就應該沒有問題了。


還是不行啊,還是這樣的OPEN.TXT UX


那你這樣,不打開文件,直接創(chuàng)建文件往里面寫數(shù)據(jù),然后在直接的關(guān)閉文件,看下這里面還有沒有這個數(shù)據(jù)


有,還是那些數(shù)據(jù);OPEN.TXT 0X


那文件的屬性里面的大小是多少?你可以用CH375FileModify這個函數(shù)將長度強制更新為1,然后在去看下還有沒有


這樣就沒有了 但是strcpy((char *)mCmdParam.Create.mPathName, "/OPEN.TXT"); /* 文件名 */ i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); mCmdParam.Modify.mFileAttr = 0xff; /* 輸入?yún)?shù): 新的文件屬性,為0FFH則不修改 */ mCmdParam.Modify.mFileTime = MAKE_FILE_TIME( hour, minute, second ); /* 輸入?yún)?shù): 新的文件時間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認時間 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( year, month, day ); /* 輸入?yún)?shù): 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = 1; /* 輸入?yún)?shù): 如果原文件較小,那么新的文件長度與原文件一樣長,否則被RAM所限,如果文件長度大于64KB,那么NewSize必須為UINT32 */ i = CH375FileModify( ); /* 修改當前文件的信息,修改日期和長度 */ mStopIfError( i ); mCmdParam.Close.mUpdateLen = 0; i = CH375FileClose( ); mStopIfError( i ); 在這之后重新打開寫入數(shù)據(jù)的話,那段還是有的,如果不寫入的話,那些沒有了,文件長度為1字節(jié)


現(xiàn)在可以肯定的是,創(chuàng)建文件的時候造成的,我把創(chuàng)建文件那部分給屏蔽掉以后,沒問題了! 但是怎樣才能創(chuàng)建文件,而又不出問題呢?


那要是這樣的話,有一種避免的辦法就是在你創(chuàng)建好文件之后強制更新文件長度為1,然后在打開文件寫文件就可以了。


我現(xiàn)在是創(chuàng)建后,把長度設(shè)為0(如果設(shè)為1的話,文件第一個字符是'.'),重新打開文件,在這之前通過串口查看各個變量還是正確的,但是后面給 mCmdParam.ByteWrite.mByteBuffer賦值后,通過串口把值發(fā)送上來,里面根本不是我設(shè)定的值,而且其他字符也都傳不上來,例如printf("write open time %c%c\n",mCmdParam.ByteWrite.mByteBuffer[0],mCmdParam.ByteWrite.mByteBuffer[1]);。根本得不到值,就連前面的“write open time ” 都接收不到,要是文件已經(jīng)創(chuàng)建,再后面添加的話,都沒問題了,一切都OK了。我不知道這是什么原因早成的,難道是創(chuàng)建后mCmdParam.ByteWrite.mByteBuffer不對了,可是我用同樣的辦法創(chuàng)建其他文件都沒問題啊。


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频