FATFS Copy Files
1 // 文件复制 2 // 将psrc文件,copy到pdst. 3 // psrc,pdst:源文件和目标文件 4 // fwmode:文件写入模式 5 // 0:不覆盖原有的文件 6 // 1:覆盖原有的文件 7 u8 mf_copy ( u8 * psrc, u8 * pdst, u8 fwmode ) 8 { 9 u8 res; 10 u16 br = 0; 11 u16 bw = 0; 12 FIL * fsrc = 0; 13 FIL * fdst = 0; 14 u8 * fbuf = 0; 15 fsrc = ( FIL* )mymalloc ( SRAMIN, sizeof( FIL ) ); // 申请内存 16 fdst = ( FIL* )mymalloc ( SRAMIN, sizeof( FIL ) ); 17 fbuf = ( u8* )mymalloc ( SRAMIN, 512 ); 18 if ( fsrc == NULL || fdst == NULL || fbuf == NULL ) 19 { 20 res = 100; 21 } // 前面的值留给fatfs 22 else 23 { 24 if ( fwmode == 0 ) 25 { 26 fwmode = FA_CREATE_NEW; 27 } // 不覆盖 28 else 29 { 30 fwmode = FA_CREATE_ALWAYS; 31 } // 覆盖存在的文件 32 33 res = f_open ( fsrc, ( const TCHAR * )psrc, FA_READ | FA_OPEN_EXISTING ); 34 // 打开只读文件 35 if ( res == 0 ) 36 { 37 res = f_open ( fdst, ( const TCHAR * )pdst, FA_WRITE | fwmode ); 38 } // 第一个打开成功,才开始打开第二个 39 if ( res == 0 ) // 两个都打开成功了 40 { 41 while ( res == 0 ) // 开始复制 42 { 43 res = f_read ( fsrc, fbuf, 512, ( UINT* )&br ); // 源头读出512字节 44 if ( res || br == 0 ) 45 { 46 break; 47 } 48 res = f_write ( fdst, fbuf, ( UINT )br, ( UINT* )&bw ); // 写入目的文件 49 if ( res || bw < br ) 50 { 51 break; 52 } 53 } 54 f_close ( fsrc ); 55 f_close ( fdst ); 56 } 57 } 58 myfree ( SRAMIN, fsrc ); // 释放内存 59 myfree ( SRAMIN, fdst ); 60 myfree ( SRAMIN, fbuf ); 61 return res; 62 } 63 64 // 得到路径下的文件夹 65 // 返回值:0,路径就是个卷标号. 66 // 其他,文件夹名字首地址 67 u8 * get_src_dname ( u8 * dpfn ) 68 { 69 u16 temp = 0; 70 while ( *dpfn != 0 ) 71 { 72 dpfn++; 73 temp++; 74 } 75 if ( temp < 4 ) 76 { 77 return 0; 78 } 79 while ( ( *dpfn != 0x5c ) && ( *dpfn != 0x2f ) ) 80 { 81 dpfn--; 82 } // 追述到倒数第一个"\"或者"/"处 83 return++dpfn; 84 } 85 86 // 文件夹复制 87 // 将psrc文件夹,copy到pdst文件夹. 88 // pdst:必须形如"X:"/"X:XX"/"X:XX/XX"之类的.而且要实现确认上一级文件夹存在 89 // psrc,pdst:源文件夹和目标文件夹 90 // fwmode:文件写入模式 91 // 0:不覆盖原有的文件 92 // 1:覆盖原有的文件 93 u8 mf_dcopy ( u8 * psrc, u8 * pdst, u8 fwmode ) 94 { 95 #define MAX_PATHNAME_DEPTH 512+1 //最大目标文件路径+文件名深度 96 u8 res = 0; 97 DIR * srcdir = 0; // 源目录 98 DIR * dstdir = 0; // 源目录 99 FILINFO * finfo = 0; // 文件信息 100 u8 * fn = 0; // 长文件名 101 102 u8 * dstpathname = 0; // 目标文件夹路径+文件名 103 u8 * srcpathname = 0; // 源文件夹路径+文件名 104 105 u16 dstpathlen = 0; // 目标路径长度 106 u16 srcpathlen = 0; // 源路径长度 107 108 srcdir = ( DIR* )mymalloc ( SRAMIN, sizeof( DIR ) ); // 申请内存 109 dstdir = ( DIR* )mymalloc ( SRAMIN, sizeof( DIR ) ); 110 finfo = ( FILINFO* )mymalloc ( SRAMIN, sizeof( FILINFO ) ); 111 112 if ( srcdir == NULL || dstdir == NULL || finfo == NULL ) 113 { 114 res = 100; 115 } 116 if ( res == 0 ) 117 { 118 finfo->lfsize = _MAX_LFN * 2 + 1; 119 finfo->lfname = mymalloc ( SRAMIN, finfo->lfsize ); // 申请内存 120 dstpathname = mymalloc ( SRAMIN, MAX_PATHNAME_DEPTH ); 121 srcpathname = mymalloc ( SRAMIN, MAX_PATHNAME_DEPTH ); 122 if ( finfo->lfname == NULL || dstpathname == NULL || srcpathname == NULL ) 123 { 124 res = 101; 125 } 126 if ( res == 0 ) 127 { 128 dstpathname[ 0 ] = 0; 129 srcpathname[ 0 ] = 0; 130 strcat ( ( char * )srcpathname, ( const char * )psrc ); // 复制原始源文件路径 131 strcat ( ( char * )dstpathname, ( const char * )pdst ); // 复制原始目标文件路径 132 res = f_opendir ( srcdir, ( const TCHAR * )psrc ); // 打开源目录 133 if ( res == 0 ) // 打开目录成功 134 { 135 strcat ( ( char * )dstpathname, ( const char * )"/" ); // 加入斜杠 136 fn = get_src_dname ( psrc ); 137 if ( fn == 0 ) // 卷标拷贝 138 { 139 dstpathlen = strlen ( ( const char * )dstpathname ); 140 dstpathname[ dstpathlen ] = psrc[ 0 ]; // 记录卷标 141 dstpathname[ dstpathlen + 1 ] = 0; // 结束符 142 } 143 else 144 { 145 strcat ( ( char * )dstpathname, ( const char * )fn ); 146 } // 加文件名 147 res = f_mkdir ( ( const TCHAR * )dstpathname ); 148 // 如果文件夹已经存在,就不创建.如果不存在就创建新的文件夹. 149 if ( res == FR_EXIST ) 150 { 151 res = 0; 152 } 153 while ( res == 0 ) // 开始复制文件夹里面的东东 154 { 155 res = f_readdir ( srcdir, finfo ); // 读取目录下的一个文件 156 if ( res != FR_OK || finfo->fname[ 0 ] == 0 ) 157 { 158 break; 159 } // 错误了/到末尾了,退出 160 if ( finfo->fname[ 0 ] == '.' ) 161 { 162 continue; 163 } // 忽略上级目录 164 fn = ( u8* )( *finfo->lfname ? finfo->lfname : finfo->fname ); 165 // 得到文件名 166 dstpathlen = strlen ( ( const char * )dstpathname ); // 得到当前目标路径的长度 167 srcpathlen = strlen ( ( const char * )srcpathname ); // 得到源路径长度 168 169 strcat ( ( char * )srcpathname, ( const char * )"/" ); // 源路径加斜杠 170 if ( finfo->fattrib & 0X10 ) // 是子目录 文件属性,0X20,归档文件;0X10,子目录; 171 { 172 strcat ( ( char * )srcpathname, ( const char * )fn ); // 源路径加上子目录名字 173 printf ( "\r\ncopy folder %s to %s\r\n", srcpathname, 174 dstpathname ); // 拷贝文件 175 res = mf_dcopy ( srcpathname, dstpathname, fwmode ); // 拷贝文件夹 176 } 177 else // 非目录 178 { 179 strcat ( ( char * )dstpathname, ( const char * )"/" ); // 目标路径加斜杠 180 strcat ( ( char * )dstpathname, ( const char * )fn ); // 目标路径加文件名 181 strcat ( ( char * )srcpathname, ( const char * )fn ); // 源路径加文件名 182 printf ( "\r\ncopy file %s to %s\r\n", srcpathname, 183 dstpathname ); // 拷贝文件 184 mf_copy ( srcpathname, dstpathname, fwmode ); // 复制文件 185 } 186 srcpathname[ srcpathlen ] = 0; // 加入结束符 187 dstpathname[ dstpathlen ] = 0; // 加入结束符 188 } 189 } 190 myfree ( SRAMIN, dstpathname ); 191 myfree ( SRAMIN, srcpathname ); 192 myfree ( SRAMIN, finfo->lfname ); 193 } 194 } 195 myfree ( SRAMIN, srcdir ); 196 myfree ( SRAMIN, dstdir ); 197 myfree ( SRAMIN, finfo ); 198 return res; 199 } http://www.openedv.com/posts/list/6567.htm
刚刚完成了fatfs下面的文件夹复制,貌似没有问题,Traids之前说的文件夹复制有问题,可以参考一下我这个代码. |
转载于:https://www.cnblogs.com/shangdawei/archive/2012/07/31/2616618.html
FATFS Copy Files相关推荐
- Batch Copy files and Replace content accordingly
2019独角兽企业重金招聘Python工程师标准>>> #!/bin/bash # Read all file names into an array FilesArray=($(f ...
- Java NIO(十六) Files
Java NIO Files类(java.nio.file.Files)提供了几种方法来处理文件系统中的文件. 这个Java NIO文件教程将涵盖这些方法中最常用的. Files类包含许多方法,所以如 ...
- java getfiles_Java基础教程——File类、Paths类、Files类
File类 File类在java.io包中.io代表input和output,输入和输出. 代表与平台无关的文件和目录. 可以新建.删除.重命名,但不能访问文件内容. File类里的常量: impor ...
- ansible的copy模块
功能:将 ansible 管理主机上的文件拷贝到远程主机中 一.各参数解析 1.1 常用参数 src: 待copy的文件或目录 dest: 目标copy到远程主机的具体目录(必要参数) owner: ...
- Docker的安装、镜像源更换与简单应用
Docker的安装.镜像源更换与简单应用[阅读时间:约20分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.Docker的安装 四.Docker的简单应用 1. ...
- 【Docker】Docker的三大核心组件
镜像(Image).容器(Container).仓库(Repository)是我们常说的Docker的三大组件,接下来就让我们一起详细地探索一番吧. 一.镜像(Image) 什么是Docker镜像? ...
- npm start 作用
在配置phonecat项目时需要运行npm start在本地配置一个服务器环境,npm start首先会安装一系列的必要程序,这些程序依赖package.json中的内容,package.json中的 ...
- Docker初学3:Docker的常用命令
Docker的常用命令 帮助命令 帮助命令可以在我们遇到不懂的命令时帮助我们去了解它们怎么使用. docker version # 显示 Docker 版本信息. docker info # 显示 D ...
- docker手册_Docker手册
docker手册 The concept of containerization itself is pretty old, but the emergence of the Docker Engin ...
- 【学习笔记】git 使用文档
安装 git # mac 环境 brew install git 检查是否安装成功 ➜ ~ git --version git version 2.20.1 (Apple Git-117) 卸载 gi ...
最新文章
- CentOS 查看系统版本号
- 科大星云诗社动态20210501
- VS2010 修改输出的exe名字和pdb文件名字的方法
- VTK:PolyData之MultiBlockMergeFilter
- PWN-COMPETITION-GeekChallenge2021
- 超全超详细的HTTP状态码大全
- springboot中配置文件使用2
- 从 4 个月到 7 天:Netflix 开源自家框架 Metaflow,性能像坐上了火箭
- bzoj 5297 [Cqoi2018]社交网络 高斯消元+Matrix-Tree定理
- 使用序列标注方法进行关系抽取的相关论文推荐
- Html5新特性 canvas画板画直线和等比缩放居中裁剪图片
- Linux安装cURL
- 【Linux】Debian 连接惠普打印机并共享
- 使用深度学习和物理约束求解偏微分方程
- 细化(thinning)
- C语⾔:8位、16位、32位数据转换
- Ubuntu下输入金钱符号时只能输入“₵“无法输入“$“
- html转换到pdf转换器,HTML转换到PDF转换器
- 移动页面input手机键盘中的“搜索”按键
- 看山姆大叔如此偷窥世界