OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 21847|回复: 15

如何将SD卡中的文件复制到FLASH中呢,求指教

[复制链接]

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-8-18
在线时间
5 小时
发表于 2013-8-18 09:30:27 | 显示全部楼层 |阅读模式
求大神们指教,如何将SD卡中的整个文件夹复制到FLASH中
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-18 09:52:59 | 显示全部楼层
战舰板的综合实验,fatfs里面的extern.c里面提供了你解决办法。
//文件夹复制
//注意文件夹大小不要超过4GB.
//将psrc文件夹,copy到pdst文件夹.
//pdst:必须形如"X:"/"X:XX"/"X:XX/XX"之类的.而且要实现确认上一级文件夹存在
//fcpymsg,函数指针,用于实现拷贝时的信息显示
//        pname:文件/文件夹名
//        pct:百分比
//        mode:
// [0]:更新文件名
// [1]:更新百分比pct
// [2]:更新文件夹
// [3~7]:保留
//psrc,pdst:源文件夹和目标文件夹
//totsize:总大小(当totsize为0的时候,表示仅仅为单个文件拷贝)
//cpdsize:已复制了的大小.
//fwmode:文件写入模式
//0:不覆盖原有的文件
//1:覆盖原有的文件
//返回值:0,成功
//    其他,错误代码;0XFF,强制退出
u8 exf_fdcopy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 *totsize,u32 *cpdsize,u8 fwmode)
{
#define MAX_PATHNAME_DEPTH 512+1 //最大目标文件路径+文件名深度
u8 res=0;   
    DIR *srcdir=0; //源目录
DIR *dstdir=0; //源目录
FILINFO *finfo=0; //文件信息
u8 *fn=0;    //长文件名

u8 * dstpathname=0; //目标文件夹路径+文件名
u8 * srcpathname=0; //源文件夹路径+文件名

  u16 dstpathlen=0; //目标路径长度
  u16 srcpathlen=0; //源路径长度

  
srcdir=(DIR*)mymalloc(SRAMIN,sizeof(DIR));//申请内存
  dstdir=(DIR*)mymalloc(SRAMIN,sizeof(DIR));
finfo=(FILINFO*)mymalloc(SRAMIN,sizeof(FILINFO));

    if(srcdir==NULL||dstdir==NULL||finfo==NULL)res=100;
if(res==0)
{
    finfo->lfsize=_MAX_LFN*2+1;
finfo->lfname=mymalloc(SRAMIN,finfo->lfsize);//申请内存
  dstpathname=mymalloc(SRAMIN,MAX_PATHNAME_DEPTH);
srcpathname=mymalloc(SRAMIN,MAX_PATHNAME_DEPTH);
  if(finfo->lfname==NULL||dstpathname==NULL||srcpathname==NULL)res=101;    
  if(res==0)
{
dstpathname[0]=0;
srcpathname[0]=0;
strcat((char*)srcpathname,(const char*)psrc);  //复制原始源文件路径
strcat((char*)dstpathname,(const char*)pdst);  //复制原始目标文件路径
    res=f_opendir(srcdir,(const TCHAR*)psrc);  //打开源目录
    if(res==0)//打开目录成功 
{
   strcat((char*)dstpathname,(const char*)"/");//加入斜杠
  fn=exf_get_src_dname(psrc);
if(fn==0)//卷标拷贝
{
dstpathlen=strlen((const char*)dstpathname);
dstpathname[dstpathlen]=psrc[0]; //记录卷标
dstpathname[dstpathlen+1]=0; //结束符 
}else strcat((char*)dstpathname,(const char*)fn);//加文件名
  fcpymsg(fn,0,0X04);//更新文件夹名
res=f_mkdir((const TCHAR*)dstpathname);//如果文件夹已经存在,就不创建.如果不存在就创建新的文件夹.
if(res==FR_EXIST)res=0;
while(res==0)//开始复制文件夹里面的东东
{
        res=f_readdir(srcdir,finfo); //读取目录下的一个文件
        if(res!=FR_OK||finfo->fname[0]==0)break; //错误了/到末尾了,退出
        if(finfo->fname[0]=='.')continue;      //忽略上级目录
fn=(u8*)(*finfo->lfname?finfo->lfname:finfo->fname);  //得到文件名
dstpathlen=strlen((const char*)dstpathname); //得到当前目标路径的长度
srcpathlen=strlen((const char*)srcpathname); //得到源路径长度

strcat((char*)srcpathname,(const char*)"/");//源路径加斜杠
  if(finfo->fattrib&0X10)//是子目录(文件属性,0X20,归档文件;0X10,子目录;)
{
strcat((char*)srcpathname,(const char*)fn); //源路径加上子目录名字
res=exf_fdcopy(fcpymsg,srcpathname,dstpathname,totsize,cpdsize,fwmode); //拷贝文件夹
}else //非目录
{
strcat((char*)dstpathname,(const char*)"/");//目标路径加斜杠
strcat((char*)dstpathname,(const char*)fn); //目标路径加文件名
strcat((char*)srcpathname,(const char*)fn); //源路径加文件名
  fcpymsg(fn,0,0X01);//更新文件名
res=exf_copy(fcpymsg,srcpathname,dstpathname,*totsize,*cpdsize,fwmode);//复制文件
*cpdsize+=finfo->fsize;//增加一个文件大小
}
srcpathname[srcpathlen]=0;//加入结束符
dstpathname[dstpathlen]=0;//加入结束符     

    }   
   myfree(SRAMIN,dstpathname);
  myfree(SRAMIN,srcpathname);
myfree(SRAMIN,finfo->lfname);
}
  }
myfree(SRAMIN,srcdir);
myfree(SRAMIN,dstdir);
myfree(SRAMIN,finfo);
    return res;   
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-8-18
在线时间
5 小时
 楼主| 发表于 2013-8-18 15:48:45 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
好的,谢谢原子哥
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-8-18
在线时间
5 小时
 楼主| 发表于 2013-8-24 22:49:48 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,请问下u8 exf_fdcopy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 *totsize,u32 *cpdsize,u8 fwmode)中的(*fcpymsg)(u8*pname,u8 pct,u8 mode),要怎么写呢,可否给个参考呢,谢谢吖
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-25 22:57:46 | 显示全部楼层
我上面不是给你代码了么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-8-18
在线时间
5 小时
 楼主| 发表于 2013-9-5 21:53:00 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子哥,请问下如果我想将W25Q64中的4M用做文件系统,需要设哪里呢,谢谢吖,我搞了挺久,还是摸不到吖。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-5 23:07:43 | 显示全部楼层
回复【6楼】jackboy:
---------------------------------
参考我们的例程,很快可以搞定吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-8-18
在线时间
5 小时
 楼主| 发表于 2013-9-5 23:20:42 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
可以给个提示吗?我改了字库的地址,扇区,但没有成功,有点急,麻烦了
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-8-18
在线时间
5 小时
 楼主| 发表于 2013-9-5 23:56:50 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,OK了,还想问下就是我格式化FLASH后,将我的文件放到FLASH里了,但我改写了6M以后的几百K数据后,文件系统就不见了,请问是什么原因呢。重新刷文件进去又可以看,但一改写就会又不行的
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-6 00:51:42 | 显示全部楼层
你地址分配没有混乱吧?
没混乱就不会出问题的。
检查你的地址分配是不是正确。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-8-18
在线时间
5 小时
 楼主| 发表于 2013-9-6 23:58:19 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
#define FLASH_SECTOR_SIZE  512   
      
u16     FLASH_SECTOR_COUNT=2048*6;//6M字节,默认为W25Q64
#define FLASH_BLOCK_SIZE   8     //每个BLOCK有8个扇区
我是这样设的
我做了实验,将那几百K都写为0,用了文件的格式化后
if(res==0X0D)//文件系统不存在
{
res=f_mkfs(1,1,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
if(res==0)
{
  res=exf_getfree("1:",&dtsize,&dfsize);//重新获取容量
}
}
那几百K里的数据就是非0了,这时可以看文件系统,我重写0后,文件系统就看不到了,请问,我还需要设其他什么地方吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-7 10:38:58 | 显示全部楼层
回复【11楼】jackboy:
---------------------------------
我们例程也是这样的啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2013-5-30
在线时间
0 小时
发表于 2013-10-26 10:49:21 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
你的最新历程里边并没有exf_fdcopy这个函数啊,只在exfuns.h里边申明了下没有定义啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-26 14:11:16 | 显示全部楼层
回复【13楼】辉Se天空:
---------------------------------
这函数,看战舰板综合实验。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2013-5-30
在线时间
0 小时
发表于 2013-10-26 20:29:55 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-8-21
在线时间
9 小时
发表于 2018-9-20 15:01:20 | 显示全部楼层
原子哥。能不能发一下全部的文件夹复制函数 这里面少了几个函数的实现 因为实在找不到战舰版的综合实验资料
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 04:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表