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

验证了一下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

}
      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;  
}

FATFS文件系统复制文件相关推荐

  1. STM32挂载SD卡基于Fatfs文件系统读取文件信息

    STM32挂载SD卡基于Fatfs文件系统读取文件信息

  2. 利用FatFs文件系统读取文件最近一次修改日期和时间

    1.FILINFO文件状态结构体 FILINFO结构保存有关f_readdir.f_findfirst.f_findnext和f_stat函数检索的对象的信息,它包括6个成员,我们在获取有关文件最近一 ...

  3. oracle 拷贝文件到asm,Oracle 从ASM复制文件到文件系统

    工作中,有时需要把文件从ASM中复制到文件系统中或者反过来,做一些维护操作,本文介绍了4种复制文件的的方法:ASMCMD中的cp命令(11g) dbms_file_transfer包 rman的con ...

  4. cdfs光盘怎么复制文件_什么是CDFS(光盘文件系统)?

    cdfs光盘怎么复制文件 CDFS:光盘文件系统 (CDFS: Compact Disc File System) CDFS is an abbreviation of the "Compa ...

  5. 使用HVR数据复制软件完成文件系统上文件的实时复制(即:文件系统的灾备)

    大家知道,HVR的复制功能之一,就是可以完成文件系统上文件的复制,达到文件系统上文件的灾备的目的. 整个过程分为如下四个步骤: 第一步:配置Location 第二步:配置Channel 第三步:定义A ...

  6. stm32开发3D打印机(六)——使用FATFS文件系统读取打印文件 获取信息 执行转换 转换坐标(上)

    这篇文章为读取打印文件(后缀为gcode的文件),并添加USMART功能调试 因为TFATFS移植与USMATRT没有什么好写的,而且在下方的链接:正点原子教程已经有详细的教程了,所以跳过了TATFS ...

  7. 对于目标文件系统,文件过大无法复制到u盘:

    对于目标文件系统,文件过大无法复制到u盘的解决方案:  原因分析:文件系统差异造成的传输失败!      1.格式化 (1). (2) (3) (4)完成,可以复制 2.使用转换方式将u盘文件系统转换 ...

  8. 复制iso镜像文件到U盘时,提示对于目标文件系统,文件“CentOS-7-x86_64-DVD_1810.iso”过大

    问题: 复制iso镜像文件到U盘时,提示对于目标文件系统,文件"CentOS-7-x86_64-DVD_1810.iso"过大 如下图所示: 原因: U盘的格式为FAT32,对于F ...

  9. win系统,复制文件提示对于目标文件系统过大

    今天在帮助同事,往U盘上复制文件的时候,系统提示对于目标文件系统,文件XXXXX过大. 原因 U盘的格式是FAST32, FAST32的文件系统不支持大于4G的单个文件 解决 需要将U盘的格式转换为N ...

最新文章

  1. postgreSQL外键引用查询 查询外键被那些表占用
  2. linux不能获取地址吗,Linux命令源代码获取地址,机不可失,失不再来!
  3. bzoj千题计划303:bzoj4827: [Hnoi2017]礼物
  4. Java基础-等待子线程结束
  5. C#如何获得当前程序所在的目录
  6. 干货 | 携程数据库发布系统演进之路
  7. js可以放gif吗_你清楚,一瓶开过的葡萄酒,最长可以放多久的时间吗?
  8. linux任务调度语法,linux crond任务调度-Go语言中文社区
  9. angularjs directive2
  10. IDEA常用的风格设置
  11. mysql 数据库日志管理工具_mysql mysqlbinlog日志管理工具使用教程
  12. 如何将 byte[] 转换为 IntPtr?
  13. Android* 操作系统上的应用程序远程调试
  14. 计算机操作系统第四版课后习题答案(完整版)
  15. Linux编程中C语言头文件位置
  16. php获取扫描枪数据,条码扫描枪的读取技巧
  17. php 领红包程序,用PHP实现的抢红包小程序
  18. vs2013 error C1083: 无法打开包括文件: SDKDDKVer.h: No such file or direc
  19. 矩阵等价和向量组等价
  20. Latex 参考文献格式

热门文章

  1. 检测用户中的异常--UEBA方法
  2. python工程师的职业规划_一名Python开发工程师的职业规划
  3. php图形验证码验证,php图片验证码代码
  4. PMP 敏捷管理相关知识点
  5. java毕业设计选题基于JavaWeb项目实现的高校学生在线选课系统
  6. html大风效果,使用jquery.windy制作风吹卡片的效果 | jQuery教程
  7. 阿里云研究中心主任田丰: 如何从实体经济走向智能产业
  8. doccano安装与使用(Win10)
  9. vscode replace with a newline
  10. cern ROOT 读取TXT文件数据并画一个简单的直方图