验证了一下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("
copy folder %s to %s
",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("
copy file %s to %s
",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;
}
---------------------------------
哈哈,谢谢共享啊,虽然和我那个有一点区别。
我也说说我那个的核心思路吧
我那个文件夹复制,先搜索目标文件夹是否存在,不存在就新建,如果存在,就搜索目标文件夹里面的文件,和源文件夹里面的对比,如果不存在,则复制文件,如果搜索到源文件夹里面的是目录,目标文件夹没有,则新建目录,然后立刻进入目录进行复制,这里是一个循环,算法和上面一样,也是搜索文件,是文件则复制,不是文件是文件夹则看是否存在,但源目录读到最后,出现fname[0]==NULL的时候,就返回上一级目录,并在源目录下用f_readdir读取到之前进入文件夹复制的位置,然后继续往下读,跳过前一个已经成功复制的文件夹,这就是校验,如果校验过程中遇到文件夹,则进入,重复开始的步骤,也是一直读到NULL为止,最后校验的时候返回上一级目录要每次判断一下是否是复制的源目录相同,是的话,退出。
这就是核心复制文件夹算法。
之前在例程里看到的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函数,谢谢!
---------------------------------
当然可以
---------------------------------
怎么实现呢?从SD卡将文件夹复制到Flash里。站长,有教程或者程序吗?
一周热门 更多>