原创 深入理解文件系统(三)

2010-3-30 08:52 3160 6 6 分类: MCU/ 嵌入式

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

        


三、添加命令fchdrivefmove


 


1、目的


1fchdrive在支持相对目录 的情况下改变当前逻辑磁盘。


2fmove:两个参数,将文件移动到另一个位置,可以改名,也可以保留原名。


2fchdrive 命令的实现


       1)添加命令支持


这个不再赘述。


2)实现代码


void UartCmdFChDrive(u8 argc,void **argv){      


    BYTE Drive;


       FRESULT res="FR"_INVALID_DRIVE;


       if ( *( (BYTE*)argv[1]+1 )==':' ){ 检查参数,是不是1:类似格式


           Drive =*( (BYTE*)argv[1]) - '0';  取出磁盘号


         res=f_chdrive( Drive );      }


     if ( res!=FR_OK) { Uart_PutString( "Invalid path!\r\n");return;}


     Uart_PutString( "Current disk is changed!\r\n");


}


*( (BYTE*)argv[1])这个意思是先将argv[1]转换为BYTE指针,再取出里面的数据(BYTE,一个字节。)


以下是实现的截图:


 


 点击看大图


3fmove命令的实现


1)这个命令带两个参数:第一个是文件的原有路径,第二个是新路径,同时可以更改文件名。


2实现的原理


创建新文件的方式 打开新路径的文件。这样会创建一个目录项,填充一个文件信息结构体。然后打开原有路径的文件,也会得到一个文件信息结构体。将旧结构体的文件大小、起始簇号复制到新的结构体,然后更新新文件的信息。然后删除原有路径的文件。移动操作完成


3)代码编写


需要两次打开文件,所以需要两个文件信息结构体。


res = f_open ( &FileOld, (const char *)argv[1], FA_WRITE );


res = f_open ( &FileNew, (const char *)argv[2], FA_CREATE_NEW );


 


      FileNew.fsize = FileOld.fsize; // 改变新文件的大小等于原文件


      FileNew.org_clust = FileOld.org_clust; //新文件的簇等于原文件的簇。


      FileNew.flag |= FA__WRITTEN;  //文件属性已改变,需要更新


      res=f_close ( &FileNew ); //关闭时进行更新。


      res=f_unlink ( (const char *)argv[1] ); //删除原文件


编译,下载测试,功能正常。以下是实现的截图。


点击看大图

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条