初级会员

- 积分
- 97
- 金钱
- 97
- 注册时间
- 2016-3-24
- 在线时间
- 21 小时
|

楼主 |
发表于 2021-10-7 20:12:55
|
显示全部楼层
我尝试过,图片如果是几K可以复制成功,几百K复制失败,参考的是原子哥的例程
//文件复制
//将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;
} |
|