<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
十、添加命令flist
1、目标
这个命令的作用是显示当前目录下的所有目录和文件,在串口终端上以这样的形式显示。
名称 属性(目录还是文件) 大小
2、准备工作
先浏览一遍ff.h,看ff.c对外输出的函数。FRESULT f_opendir (DIR*, const XCHAR*)、FRESULT f_readdir (DIR*, FILINFO*)这两个函数就是获取目录项信息。
前一个函数f_opendir给出两个参数,字符串指针是用户指定的目录,DIR信息结构体是在根据目录字符串经过查找、对比后,用该目录的关键信息:起始簇号,填充该结构体。
后一个函数根据目录的起始簇号和目录项索引号,获取当前目录项的所有信息,并填充FILINFO信息结构体,用户根据该结构体得到所需要的信息并显示。
从这里开始,要支持相对路径,故设置#define _FS_RPATH 1。
3、命令的添加过程
这里不再详细叙述。
#define UartCmdMaxCount 13 //现在支持13个内部命令
u8* UartCmdStrTable[UartCmdMaxCount]={ //串口命令字符串
"help","cls","ledon","ledoff",
"time","temp","i2cwr","i2crd",
"sdrd","sdwr","fread","fwrite",
"flist"};
声明void UartCmdFList(u8 argc,void **argv);
4、编写函数UartCmdFList
要用到目录结构信息体和文件属性结构体,先定义:
DIR DirInf; FILINFO fileinf;
res=f_opendir(&DirInf, argv[1]); // 如果不带参数,则从当前目录开始
if ( res!=FR_OK) { Uart_PutString( "DIR Open Error!\r\n"); return;}
for ( ;DirInf.sect>0 ; ) { //是否读完根据当前扇区sect的值,因为目录项读完后设为0.
res=f_readdir(&DirInf,&FileInf); //读取目录项,索引会自动下移。
Uart_PutString ( (u8 *)FileInf.fname );
Uart_PutString ( " " );
if ( FileInf.fattrib & AM_DIR == AM_DIR ) { Uart_PutString ( " 目录 " );}
else { Uart_PutString ( "文件 " );}
sprintf ( (char *)InfStr, "%d Bytes", FileInf.fsize);
Uart_PutString ( InfStr );
Uart_PutString("\r\n");
}
5、编译下载,测试
串口输入命令:
Sh>flist 0:/111 第一次输入
. 文件 0 Bytes
.. 文件 0 Bytes
AAA.TXT 文件 1380 Bytes
BBB.TXT 文件 277 Bytes
CCC.TXT 文件 0 Bytes
新建文~1 文件 0 Bytes
Sh>flist 111 第二次输入
. 文件 0 Bytes
.. 文件 0 Bytes
AAA.TXT 文件 1380 Bytes
BBB.TXT 文件 277 Bytes
CCC.TXT 文件 0 Bytes
新建文~1 文件 0 Bytes
Sh>flist 第三次输入,默认显示当前目录
BBB.TXT 文件 1536 Bytes
DDD.TXT 文件 2048 Bytes
111 文件 0 Bytes
LLL.TXT 文件 0 Bytes
MMM.TXT 文件 0 Bytes
222 文件 0 Bytes
我的文档 文件 0 Bytes
说明这个命令是成功了,目录项的性质显示错误,明明是目录确显示成文件。
用户1025563 2010-9-26 16:11
用户1174614 2010-9-5 20:07