OpenEdv-开源电子网

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

刚刚完成了fatfs下面的文件夹复制,貌似没有问题,Traids之前说的文件夹复制有问题,可以参考一下我这个代码.

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-7-10 17:14:09 | 显示全部楼层 |阅读模式

验证了一下SYSTEM文件夹的COPY,没有问题.
以下代码需要用到malloc,在论坛我已经发帖过,可以搜索一下,或者使用系统的malloc.

//文件复制
//将psrc文件,copy到pdst.
//psrc,pdst:源文件和目标文件
//fwmode:文件写入模式
//0:不覆盖原有的文件
//1:覆盖原有的文件
u8 mf_copy(u8 *psrc,u8 *pdst,u8 fwmode)
{
 u8 res;
    u16 br=0;
 u16 bw=0;
 FIL *fsrc=0;
 FIL *fdst=0;
 u8 *fbuf=0;
  fsrc=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//申请内存
  fdst=(FIL*)mymalloc(SRAMIN,sizeof(FIL));
 fbuf=(u8*)mymalloc(SRAMIN,512);
   if(fsrc==NULL||fdst==NULL||fbuf==NULL)res=100;//前面的值留给fatfs
 else
 {  
  if(fwmode==0)fwmode=FA_CREATE_NEW;//不覆盖
  else fwmode=FA_CREATE_ALWAYS;   //覆盖存在的文件
  
   res=f_open(fsrc,(const TCHAR*)psrc,FA_READ|FA_OPEN_EXISTING); //打开只读文件
   if(res==0)res=f_open(fdst,(const TCHAR*)pdst,FA_WRITE|fwmode);  //第一个打开成功,才开始打开第二个
  if(res==0)//两个都打开成功了
  {
    while(res==0)//开始复制
   {
    res=f_read(fsrc,fbuf,512,(UINT*)&br); //源头读出512字节
    if(res||br==0)break;
    res=f_write(fdst,fbuf,(UINT)br,(UINT*)&bw); //写入目的文件
    if(res||bw<br)break;      
   }
      f_close(fsrc);
      f_close(fdst);
  }
 }
 myfree(SRAMIN,fsrc);//释放内存
 myfree(SRAMIN,fdst);
 myfree(SRAMIN,fbuf);
 return res;
}

//得到路径下的文件夹
//返回值:0,路径就是个卷标号.
//    其他,文件夹名字首地址
u8* get_src_dname(u8* dpfn)
{
 u16 temp=0;
  while(*dpfn!=0)
 {
  dpfn++;
  temp++; 
 }
 if(temp<4)return 0;
 while((*dpfn!=0x5c)&&(*dpfn!=0x2f))dpfn--; //追述到倒数第一个"\"或者"/"处
 return ++dpfn;
}
//文件夹复制
//将psrc文件夹,copy到pdst文件夹.
//pdst:必须形如"X:"/"X:XX"/"X:XX/XX"之类的.而且要实现确认上一级文件夹存在
//psrc,pdst:源文件夹和目标文件夹
//fwmode:文件写入模式
//0:不覆盖原有的文件
//1:覆盖原有的文件
u8 mf_dcopy(u8 *psrc,u8 *pdst,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=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);//加文件名  
    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);  //源路径加上子目录名字
       printf("\r\ncopy folder %s to %s\r\n",srcpathname,dstpathname);//拷贝文件
      res=mf_dcopy(srcpathname,dstpathname,fwmode); //拷贝文件夹
     }else //非目录
     {
      strcat((char*)dstpathname,(const char*)"/");//目标路径加斜杠
      strcat((char*)dstpathname,(const char*)fn); //目标路径加文件名
      strcat((char*)srcpathname,(const char*)fn); //源路径加文件名
      printf("\r\ncopy file %s to %s\r\n",srcpathname,dstpathname);//拷贝文件
      mf_copy(srcpathname,dstpathname,fwmode); //复制文件
     }
     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
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2012-7-10 17:21:59 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
哈哈,谢谢共享啊,虽然和我那个有一点区别。
我也说说我那个的核心思路吧
我那个文件夹复制,先搜索目标文件夹是否存在,不存在就新建,如果存在,就搜索目标文件夹里面的文件,和源文件夹里面的对比,如果不存在,则复制文件,如果搜索到源文件夹里面的是目录,目标文件夹没有,则新建目录,然后立刻进入目录进行复制,这里是一个循环,算法和上面一样,也是搜索文件,是文件则复制,不是文件是文件夹则看是否存在,但源目录读到最后,出现fname[0]==NULL的时候,就返回上一级目录,并在源目录下用f_readdir读取到之前进入文件夹复制的位置,然后继续往下读,跳过前一个已经成功复制的文件夹,这就是校验,如果校验过程中遇到文件夹,则进入,重复开始的步骤,也是一直读到NULL为止,最后校验的时候返回上一级目录要每次判断一下是否是复制的源目录相同,是的话,退出。
这就是核心复制文件夹算法。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
 楼主| 发表于 2012-7-10 21:36:53 | 显示全部楼层
我的是直接读目录,然后一级级复制
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
351
金钱
351
注册时间
2013-4-23
在线时间
98 小时
发表于 2013-5-15 08:26:22 | 显示全部楼层
终于找到这个贴子了,非常感谢呀。

     之前在例程里看到的u8 exf_copy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 totsize,u32 cpdsize,u8 fwmode)
这个函数也没看到使用例程,这些参数不知道如何使用,研究半天不知这个u8(*fcpymsg)(u8*pname,u8 pct,u8 mode)参数如何处理,今早看到这个帖子,几分钟解决了我的大问题。如果原子方便的话,详解一下exf_copy函数,谢谢!
回复 支持 反对

使用道具 举报

12

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-7-24
在线时间
37 小时
发表于 2015-6-6 13:46:34 | 显示全部楼层
能不能 两个磁盘之间复制数据!如从SD卡考到SPI FLASH里!用文件系统来考?  原子 哥!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
 楼主| 发表于 2015-6-7 00:46:07 | 显示全部楼层
回复【5楼】tanguicaicai:
---------------------------------
当然可以
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2015-7-11
在线时间
0 小时
发表于 2015-7-16 11:04:34 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
怎么实现呢?从SD卡将文件夹复制到Flash里。站长,有教程或者程序吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
 楼主| 发表于 2015-7-16 23:26:19 | 显示全部楼层
回复【7楼】ming_ge:
---------------------------------
我们的 综合实验就有。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-7-25
在线时间
9 小时
发表于 2015-7-25 15:13:18 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子哥说清楚点啊,能不能把综合实验贴的源代码贴出来啊。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
 楼主| 发表于 2015-7-26 22:07:06 | 显示全部楼层
回复【9楼】stm32灬菜鸟:
---------------------------------
自己看。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
520
金钱
520
注册时间
2015-12-2
在线时间
161 小时
发表于 2016-12-10 20:22:44 | 显示全部楼层
汗,,,原来还是打开然后一点一点的复制过去啊,FATFS不提供这样的函数直接复制啊!
我按到了有移动但是果然还是没有复制的  要自己写
飞飞飞飞飞
回复 支持 反对

使用道具 举报

4

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2017-12-6
在线时间
50 小时
发表于 2017-12-8 16:20:28 | 显示全部楼层
你好,原子哥,我用的是探索者,里面例程我找了下,没看到有复制文件的,能问下是在哪一节里面吗
回复 支持 反对

使用道具 举报

55

主题

474

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2374
金钱
2374
注册时间
2017-8-7
在线时间
207 小时
发表于 2018-6-29 16:36:01 | 显示全部楼层
原子哥为什么我用你这个函数就是复制失败呢,[mw_shl_code=c,true]//        OS_CRITICAL_ENTER();//&#189;&#248;è&#235;áù&#189;&#231;&#199;&#248;
                                                                                        fname=mymalloc(SRAMEX,64);                        //éê&#199;&#235;&#196;ú′&#230;       
                                                                                        sprintf((char*)fname,"1:BACKP/BACK02.dta");
                                                                                        fname1=mymalloc(SRAMEX,64);                        //éê&#199;&#235;&#196;ú′&#230;       
                                                                                        sprintf((char*)fname1,"1:");                                                                                                                                                                                               
                                                                                        res=mf_copy(fname,fname1,1);                                                                                       
                                                                                        myfree(SRAMEX,fname);               
                                                                                        myfree(SRAMEX,fname1);
                                                                                //        OS_CRITICAL_EXIT();        //í&#203;3&#246;áù&#189;&#231;&#199;&#248;[/mw_shl_code]
qq1950361006,互帮互助,共同进步。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
 楼主| 发表于 2018-6-30 01:03:57 | 显示全部楼层
kbq1950361006 发表于 2018-6-29 16:36
原子哥为什么我用你这个函数就是复制失败呢,[mw_shl_code=c,true]//        OS_CRITICAL_ENTER();//&#189;&#248; ...

仿真找问题
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-8-21
在线时间
9 小时
发表于 2018-9-20 19:25:01 | 显示全部楼层
正点原子 发表于 2015-7-26 22:07
回复【9楼】stm32灬菜鸟:
---------------------------------
自己看。

mf_fdcopy("0:/PICTURE","1:/JPG"); 原子哥 这样可以从把sd卡中的文件夹复制到flash中去?
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-8-21
在线时间
9 小时
发表于 2018-9-20 19:27:46 | 显示全部楼层
tanguicaicai 发表于 2015-6-6 13:46
能不能&nbsp;两个磁盘之间复制数据!如从SD卡考到SPI&nbsp;FLASH里!用文件系统来考?&nbsp;&nbsp;原子&nbs ...

大哥 搞出来了没有?能不能发一下
回复 支持 反对

使用道具 举报

6

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2018-8-31
在线时间
115 小时
发表于 2018-10-30 16:55:44 | 显示全部楼层
复制文件是不是一个思路,我想把图片文件复制到一个数组,然后把这个数组数据发送到串口送给上位机显示,可行吗,能不能直接从SD 卡读数据送到上位机??
回复 支持 反对

使用道具 举报

6

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2018-8-31
在线时间
115 小时
发表于 2018-10-30 17:01:44 | 显示全部楼层
u8 exf_copy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 totsize,u32 cpdsize,u8 fwmode);           //文件复制
找到了这个文件复制函数,没有在.c文件找到对应的实现函数啊,原子哥
回复 支持 反对

使用道具 举报

2

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
377
金钱
377
注册时间
2015-10-19
在线时间
173 小时
发表于 2018-12-16 15:50:54 | 显示全部楼层
感謝版主的程序
已經收下並用在新版 fatFs R0.13C
程序經過部分修改已可正確的工作
// 文件复制
// 将psrc文件,copy到pdst.
// psrc,pdst:源文件和目标文件
// fwmode:文件写入模式
// 0:不覆盖原有的文件
// 1:覆盖原有的文件
u8 mf_copy(u8 *psrc,u8 *pdst,u8 fwmode)
{
        u8 res;
        u8 *fbuf=0;
        u16 br=0,bw=0;
        FIL *fsrc=0,*fdst=0;
       
        fsrc=(FIL*)mymalloc(SRAMIN,sizeof(FIL));        // 申请 fsrc 内存
        fdst=(FIL*)mymalloc(SRAMIN,sizeof(FIL));        // 申请 fdst 内存
        fbuf=(u8*)mymalloc(SRAMIN,4096);                        // 申请 4096 Bytes fbuf 内存. Buffer 愈大複製速度愈快
       
        if(fsrc==NULL||fdst==NULL||fbuf==NULL){
           res=100;        // 前面的值留给fatfs
        }else{
                if(fwmode==0){
                        fwmode=FA_CREATE_NEW;                // 不覆盖
                }else{
                        fwmode=FA_CREATE_ALWAYS;           // 覆盖存在的文件
                }  
                res=f_open(fsrc,(const TCHAR*)psrc,FA_READ|FA_OPEN_EXISTING);         // 打开只读文件       
                if(!res){
                        res|=f_open(fdst,(const TCHAR*)pdst,FA_WRITE|fwmode);                  // 第一个打开成功,才开始打开第二个
                }
                if(!res){                        // 两个都打开成功了
                        while(!res){        // 开始复制
                                res=f_read(fsrc,fbuf,4096,(UINT*)&br);                 // 源头读出4096字节
                                if(res||br==0){break;}
                                res=f_write(fdst,fbuf,(UINT)br,(UINT*)&bw); // 写入目的文件
                                if(res||bw<br){break; }      
                        }
                        f_close(fsrc);        // close file fsrc
                        f_close(fdst);        // close file fdst
                }
        }
        myfree(SRAMIN,fsrc);        // 释放 fsrc 内存
        myfree(SRAMIN,fdst);        // 释放 fdst 内存
        myfree(SRAMIN,fbuf);        // 释放 fbuf 内存
        return res;
}


// 得到路径下的文件夹
// 返回值:0,路径就是个卷标号.
//    其他,文件夹名字首地址
u8* get_src_dname(u8* dpfn)
{
        u16 temp=0;

        while(*dpfn!=0){
                dpfn++;
                temp++;
        }
        if(temp<4){return 0;}
        while((*dpfn!=0x5c)&&(*dpfn!=0x2f)){dpfn--;}        // 追述到倒数第一个"\"或者"/"处
        return ++dpfn;
}


// 文件夹复制
// 将psrc文件夹,copy到pdst文件夹.
// pdst:必须形如"X:"/"X:XX"/"X:XX/XX"之类的.而且要实现确认上一级文件夹存在
// psrc,pdst:源文件夹和目标文件夹
// fwmode:文件写入模式
// 0:不覆盖原有的文件
// 1:覆盖原有的文件
u8 mf_dcopy(u8 *psrc,u8 *pdst,u8 fwmode)
{
        FRESULT res;   
        DIR *srcdir=0;                         // 源目录
        FILINFO finfo;                         // 文件信息
        u8 *fn=0;                             // 长文件名
        u8 * dstpathname=0;                // 目标文件夹路径+文件名
        u8 * srcpathname=0;                // 源文件夹路径+文件名
        u16 dstpathlen=0;                 // 目标路径长度
        u16 srcpathlen=0;                 // 源路径长度
//        u16 filesNum=0;                        // 總複製檔案數目
//        u32 filesSize=0;                // 總複製檔案大小(Bytes)
//        static double averageSpeed=0.0;
        double fileSizeKb=0.0;        // 當前複製操作的檔案大小(KB)
        double copySpeed=0.0;        // 當前複製操作的傳輸速度(KB/sec)
        float timeUsed=0.0;                // 當前複製操作的使用時間(sec)
        long lastTime;                        // 前一時刻(ms)
       
        srcdir=(DIR*)mymalloc(SRAMIN,sizeof(DIR));                // 申请 srcdir 内存
        srcpathname=mymalloc(SRAMIN,(FF_LFN_BUF+1)*2);        // 申请 srcpathname 内存  
        dstpathname=mymalloc(SRAMIN,(FF_LFN_BUF+1)*2);        // 申请 dstpathname 内存
        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==FR_OK){                // 打开目录成功
                res=f_mkdir((const TCHAR*)dstpathname);
                strcat((char*)dstpathname,(const char*)"/");// 加入斜杠
                fn=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);                // 加文件名
                }                                       
                res=f_mkdir((const TCHAR*)dstpathname);                                // 如果文件夹已经存在,就不创建.如果不存在就创建新的文件夹.
                if(res==FR_EXIST){res=FR_OK;}
                while(res==FR_OK){                                                                        // 开始复制文件夹里面的东东
                        res=f_readdir(srcdir,&finfo);                                     // 读取目录下的一个文件
                        if(res!=FR_OK||finfo.fname[0]==0){break;}                  // 错误了/到末尾了,退出
                        dstpathlen=strlen((const char*)dstpathname);        // 得到当前目标路径的长度
                        srcpathlen=strlen((const char*)srcpathname);         // 得到源路径长度
                        strcat((char*)srcpathname,(const char*)"/");        // 源路径加斜杠
                        strcat((char*)srcpathname,(const char*)finfo.fname);                // 源路径加上子目录名字
                        if(finfo.fattrib&0X10){                                                                                // 是子目录   文件属性,0X20,文件;0X10,子目录;
                                printf("\r\ncopy folder %s to %s\r\n",srcpathname,dstpathname);       
                                res=(FRESULT)mf_dcopy(srcpathname,dstpathname,fwmode);         // 拷贝文件夹
                        }else{         // 非目录
                                lastTime=millis;
                                fileSizeKb=finfo.fsize/1024.0;
                                strcat((char*)dstpathname,(const char*)"/");                        // 目标路径加斜杠
                                strcat((char*)dstpathname,(const char*)finfo.fname);         // 目标路径加文件名
                                printf("\r\ncopy file %s to %s ,  size=%ld Bytes (%7.1f KB) ",srcpathname,dstpathname,(u32)finfo.fsize,fileSizeKb);
                                mf_copy(srcpathname,dstpathname,fwmode);         // 复制文件
                                timeUsed=(millis-lastTime)/1000.0;
                                copySpeed=fileSizeKb/timeUsed;
                                printf(",  Time used=%3.3f sec ,  speed=%4.3f KB/sec\r\n",timeUsed,copySpeed);
//                                averageSpeed+=copySpeed;
//                                filesSize+=finfo.fsize;
//                                filesNum++;
                        }
                        srcpathname[srcpathlen]=0;                                                // 加入结束符
                        dstpathname[dstpathlen]=0;                                                // 加入结束符     
                }
        }
        printf("\r\n\r\n ******** Copy files completed !!   ********\r\n\r\n\r\n");
//        printf("\r\n\r\n ********   This folder total copy [%d] files ,  Files size [%7.1f KB, (%4.2f MB)],  Average: %4.3f (KB/sec)  ********\r\n\r\n\r\n",filesNum,(double)filesSize/1024.0,(double)filesSize/1024.0/1024.0,averageSpeed/filesNum);
//        averageSpeed=0.0;
        myfree(SRAMIN,dstpathname);
        myfree(SRAMIN,srcpathname);
        myfree(SRAMIN,srcdir);
        return res;   
}

回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2012-5-30
在线时间
4 小时
发表于 2019-3-10 00:13:28 | 显示全部楼层
请问复制文件之前怎么挂载2个磁盘呢?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-12-14
在线时间
11 小时
发表于 2019-10-6 17:32:37 | 显示全部楼层
本帖最后由 天才白痴 于 2019-10-24 09:34 编辑

不是很懂那个br,bw的具体含义,在读文件的时候,br是作为输入参数的,在写文件的时候,br也是作为输入参数的,那么br,bw在哪里修改的呢?请知道细节的指点指点
已经搞明白br的含义了。就是实际读取的字节数。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2023-6-28
在线时间
2 小时
发表于 2023-8-22 10:12:09 | 显示全部楼层
fsrc=(FIL*)mymalloc(SRAMIN,sizeof(FIL));  里的SRAMIN没有定义,如何定义,谢谢!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2023-6-28
在线时间
2 小时
发表于 2023-8-22 10:43:01 | 显示全部楼层
原子哥,能给出整个工程吗,复制过来后,发现好多东西没定义。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 18:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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