文件枚举的问题? 请教大虾们!

for(j=3;j>0;j--) { mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/DCIM/1000LYMP" ); i= CH375FileOpen( ); i= mCopyCodeStringToIRAM( mCmdParam.Enumer.mPathName, "P*" ); // j = strlen( mCmdParam.Enumer.mPathName ); /* 计算文件名长度,指向结束符 */ mCmdParam.Enumer.mPathName[j] = 0xff; /* 将结束符替换为255 说明序号在变量中 */ CH375vFileSize = j; /* 指定搜索的序号,几乎没有上限 */ i=CH375FileEnumer( ); /* 文件名中含有通配符*,枚举/搜索文件而不打开 */ LED_WR_INACT( ); /* 写操作 */ i = RenameFileName( ); mStopIfError( i );

} // 程序的目的:是查找"/DCIM/1000LYMP/下面的P开头的前3个文件 并改名 (改名部分没有问题 ,直接输入路径 可以改名)

这段有错误吗? 为什么执行到这里就出错啊/ 求高手帮忙啊! 看看 1[Emot]1[/Emot][Emot]1[/Emot][Emot]1[/Emot]

哪一步出错(open 还是 enumer),出错代码是多少?


变量j的使用上混乱了,既做记数,有做文件的搜索的序号。


应该是enumer.因为执行到LED_WR_INACT( ); /* 写操作 */ 以后出错的. ]

luoye268268 { M } ::变量j的使用上混乱了,既做记数,有做文件的搜索的序号。 应该没有错吧.当开始J=3 我修改第3个符合条件的.=2 修改第二个.......有错吗

另帮看看其他还有错误吗.或用其他的方法可以吗 .?


j = strlen( mCmdParam.Enumer.mPathName ); /* 计算文件名长度,指向结束符 */ 该句改变了j的值,j 始终为2,也即枚举序号始终为2


j = strlen( mCmdParam.Enumer.mPathName ); //j变为2 mCmdParam.Enumer.mPathName[j] = 0xff; CH375vFileSize = j; j=2 返回for循环的话,j此时已经是2了。也就是for循环程序中用到了循环的条件变量j了,所以我说混乱了。 这个错误并不是引起你后面出错的原因。

是这样的,先打开文件夹再枚举(CH375FileEnumer),枚举成功返回的只是打开目录下的文件名,并不是带目录路径的完整的路径名,你再在下面调用的RenameFileName函数去打开文件的话,由于前面的并不是完整的路径名,在RenameFileName函数中肯定不能打开这个文件的。 你可以试一下在RenameFileName之前,再调用一下 mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/DCIM/1000LYMP" ); i= CH375FileOpen( ); 先打开目录/DCIM/1000LYMP,再接下去的RenameFileName之前,还得将mCmdParam.Open.mPathName缓冲区中存放的非完整的路径名中的“/”去掉。

简单的方法就是,不要先打开目录再在目录下枚举,而是直接将目录路径加到枚举文件名中去,即将i= mCopyCodeStringToIRAM( mCmdParam.Enumer.mPathName, "P*" ); 改给i= mCopyCodeStringToIRAM( mCmdParam.Enumer.mPathName, "/DCIM/1000LYMP/P*" );


还是不行啊.主程序如下: main( ) { UINT8 i,j; PZ_OFF(); GZP_OFF(); KZ_OFF(); CH375_PORT_INIT( ); /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ LED_OUT_INIT( ); LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */ mDelay100mS( ); /* 延时100毫秒 */ LED_OUT_INACT( ); mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i ); /* 其它电路初始化 */ while ( 1 ) { // if(P1_2==0) // { Paizhao(); GZP_ON(); mDelay100mS( ); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */ LED_OUT_ACT( ); /* LED亮 */ /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelay100mS( ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } for(j=3;j>0;j--) { LED_RUN_ACT( ); /* 开始操作U盘 */ /* 如果MY_ADC.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 */ mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/SUNG.TXT" ); /* 文件名,该文件在根目录下 */ i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */ mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移到文件的尾部 */ i = CH375ByteLocate( ); mStopIfError( i ); } else if ( i == ERR_MISS_FILE ) { /* 没有找到文件,必须新建文件 */ mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/SUNG.TXT" ); /* 文件名,该文件在根目录下,刚才已经提供给CH375FileOpen */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); } else mStopIfError( i ); /* 打开文件时出错 */ LED_WR_ACT( ); /* 写操作 */ i = sprintf( mCmdParam.ByteWrite.mByteBuffer, "此前文件长度= %ld 字节\xd\xa", CH375vFileSize ); LED_WR_INACT( ); mDelay100mS( ); LED_WR_ACT( ); mCmdParam.ByteWrite.mByteCount = i; /* 指定本次写入的字节数,单次读写的长度不能超过MAX_BYTE_IO */ i = CH375ByteWrite( ); /* 以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO */ mStopIfError( i ); mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */ i = CH375FileClose( ); /* 关闭文件 */ i= mCopyCodeStringToIRAM( mCmdParam.Enumer.mPathName, "/DCIM/1000LYMP/P*" ); i = strlen( mCmdParam.Enumer.mPathName ); /* 计算文件名长度,指向结束符 */ mCmdParam.Enumer.mPathName[i] = 0xff; /* 将结束符替换为255 说明序号在变量中 */ CH375vFileSize = j; /* 指定搜索的序号,几乎没有上限 */ i=CH375FileEnumer( ); /* 文件名中含有通配符*,枚举/搜索文件而不打开 */ LED_WR_INACT( ); /* 写操作 */ // mStopIfError( i ); i = RenameFileName( ); /* 修改文件名, C文件 => TXT文件 */ LED_WR_INACT( ); LED_RUN_INACT( ); } GZP_OFF(); while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘拔出 */ LED_OUT_INACT( ); /* LED灭 */

} }

前面的 对SUNG.TXT 的操作是正确的。 写了3次内容.但没有改名部分没有执行. 测试 i= mCopyCodeStringToIRAM( mCmdParam.Enumer.mPathName, "/DCIM/1000LYMP/P8140844.JPG" ); i = RenameFileName( ); 这样不能执行改名.但先进入目录/DCIM 在改名 就可以. 那应该怎么做啊.

目的 :就是把符合条件的"/DCIM/1000LYMP 目录下的3个文件改名.


怎么没人 回答啊!


在 i = RenameFileName( ); 添加i = CH375FileOpen(); 看看是否能够打开枚举到的文件

建议你看一下是哪一部出错,出错代码是什么


其中count定义:unsigned int count

for(count=0;count<3;count++){ /* 如果MY_ADC.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 */ mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/SUNG.TXT" ); /* 文件名,该文件在根目录下 */ i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */ mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移到文件的尾部 */ i = CH375ByteLocate( ); mStopIfError( i ); } else if ( i == ERR_MISS_FILE ) { /* 没有找到文件,必须新建文件 */ mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/SUNG.TXT" ); /* 文件名,该文件在根目录下,刚才已经提供给CH375FileOpen */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); } else mStopIfError( i ); /* 打开文件时出错 */ LED_WR_ACT( ); /* 写操作 */ i = sprintf( mCmdParam.ByteWrite.mByteBuffer, "此前文件长度= %ld 字节\xd\xa", CH375vFileSize ); LED_WR_INACT( ); mDelaymS( 100 ); LED_WR_ACT( ); mCmdParam.ByteWrite.mByteCount = i; /* 指定本次写入的字节数,单次读写的长度不能超过MAX_BYTE_IO */ i = CH375ByteWrite( ); /* 以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO */ mStopIfError( i ); mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */ i = CH375FileClose( ); /* 关闭文件 */

printf("enum\n"); strcpy( mCmdParam.Enumer.mPathName, "/DCIM/1000LYMP/P*" ); /* 在根目录下搜索所有文件名 */ i = strlen( mCmdParam.Enumer.mPathName ); /* 计算文件名长度,指向结束符 */ mCmdParam.Enumer.mPathName[i] = 0xFF; /* 将结束符替换为255 说明序号在变量中 */ CH375vFileSize = count; /* 指定搜索的序号,几乎没有上限 */ i=CH375FileEnumer( ); /* 文件名中含有通配符*,枚举/搜索文件而不打开 */ if ( i==ERR_MISS_FILE ) break; /* 再也搜索不到匹配文件,已经没有匹配的文件名 */ if ( i!=ERR_SUCCESS ) break; /* 出错 */ printf( "found name %d#: %s\n", count, mCmdParam.Enumer.mPathName ); /* 搜索到相匹配的文件名,显示序号和搜索到的匹配文件名或者子目录名 */ if ( CH375vFileSize!=0xFFFFFFFF ) printf( "this is a file\n" ); /* 枚举到文件 */ else printf( "this is a directory\n" ); /* 枚举到子目录 */

i = RenameFileName( ); /* 修改文件名, C文件 => TXT文件 */

}


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