[求助]我要枚举U盘里面所有的MP3再依次读出,我该怎么办啊,历程13里面是枚举所有文件,怎么改才行?

RT[求助]我要枚举U盘里面所有的MP3再依次读出,我该怎么办啊,历程13里面是枚举所有文件,怎么改才行?

用的是CH376的例程13


如果只是想要枚举MP3文件,只能通过自己软件过滤


上述问题已用下面代码解决。谢谢study的帮助! 现在我有个问题就是: 我现在已经打开MP3文件了,我应该以字节还是以扇区来读MP3文件,而我对扇区不是很了解,我是不是不用去计算哪个扇区,然后直接用读扇区的函数去读打开的MP3文件就行了?

------------------------------------------------------------------------------------------------------------ if ( ( FileNameBuffer[ OldFileCount ].Attr & ATTR_DIRECTORY ) == 0 ) { /* 是文件则打开,目录则跳过 */ nameLen = strlen( (char const *)(FileNameBuffer[ OldFileCount ].Name) ); if(nameLen < 4) continue; pExt = ((char *)(FileNameBuffer[ OldFileCount ].Name)) + nameLen - 4; if(strcmp(pExt, (char *)".MP3") == 0 ){ printf( "Open file: %s\n", FileNameBuffer[ OldFileCount ].Name ); CH376WriteVar32( VAR_START_CLUSTER, FileNameBuffer[ OldFileCount ].DirStartClust ); /* 将当前文件所在上级目录的起始簇号设置为当前簇号,相当于打开上级目录 */ s = CH376FileOpen( FileNameBuffer[ OldFileCount ].Name ); /* 打开文件 */ if ( s == USB_INT_SUCCESS ) { /* 成功打开了文件 */ s = CH376ByteRead( buf, CH376GetFileSize( ), &RealReadCount ); /* 以字节为单位从当前位置读取数据块 */ //s = CH376ByteRead( buf, sizeof(buf), &RealReadCount ); /* 以字节为单位从当前位置读取数据块 */ if ( RealReadCount != CH376GetFileSize( ) ) printf( "File size = %d\n", RealReadCount ); /* 文件长度不足sizeof(buf) */ CH376FileClose( FALSE ); /* 不做写操作可以无需关闭 */ } } }


打开文件后,默认情况下就是从最前面开始读取。循环读的话就是从最前面开始依次向文件尾部读取

当然也可以从文件的任意地址去读,比如跳过第一个扇区从第二个扇区读。


感谢红桃兄的回复,于是我按照下面的代码读取整个MP3的数据。但是问题出现了,我调试时候发现该代码在if (NewSize>U32DataCount)判断时候老是出错,明明NewSize的值还是大于U32DataCount的值的,但是却跳出了循环 ,也就是说该循环只执行了一次。我不知道我错在哪里,难道是我判断出错了吗? ----------------------------------------------------------------------------------------------------------- if ( s == USB_INT_SUCCESS ) { /* 成功打开了文件 */ NewSize = CH376GetFileSize( ); if (NewSize>U32DataCount){ s = CH376ByteRead( buf, 32, &RealReadCount ); /* 以字节为单位从当前位置读取数据块 */ U32DataCount+=RealReadCount; } printf( "MP3 size is %d\n", NewSize ); if ( U32DataCount != NewSize ) printf( "File size = %d\n", U32DataCount ); /* 文件长度不足sizeof(buf) */ CH376FileClose( FALSE ); /* 不做写操作可以无需关闭 */ U32DataCount=0;


我换成while(NewSize>U32DataCount);后发现一直在循环,跳不出来,到底怎么回事啊?


1.if (NewSize>U32DataCount) 这条语句只执行一次 是正确的; 2.跟踪一下程序看看U32DataCount值有没有发生变化


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