管理员
  
- 积分
- 165540
- 金钱
- 165540
- 注册时间
- 2010-12-1
- 在线时间
- 2117 小时
|
发表于 2013-8-18 09:52:59
|
显示全部楼层
战舰板的综合实验,fatfs里面的extern.c里面提供了你解决办法。
//文件夹复制
//注意文件夹大小不要超过4GB.
//将psrc文件夹,copy到pdst文件夹.
//pdst:必须形如"X:"/"X:XX"/"X:XX/XX"之类的.而且要实现确认上一级文件夹存在
//fcpymsg,函数指针,用于实现拷贝时的信息显示
// pname:文件/文件夹名
// pct:百分比
// mode:
// [0]:更新文件名
// [1]:更新百分比pct
// [2]:更新文件夹
// [3~7]:保留
//psrc,pdst:源文件夹和目标文件夹
//totsize:总大小(当totsize为0的时候,表示仅仅为单个文件拷贝)
//cpdsize:已复制了的大小.
//fwmode:文件写入模式
//0:不覆盖原有的文件
//1:覆盖原有的文件
//返回值:0,成功
// 其他,错误代码;0XFF,强制退出
u8 exf_fdcopy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 *totsize,u32 *cpdsize,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=exf_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);//加文件名
fcpymsg(fn,0,0X04);//更新文件夹名
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); //源路径加上子目录名字
res=exf_fdcopy(fcpymsg,srcpathname,dstpathname,totsize,cpdsize,fwmode); //拷贝文件夹
}else //非目录
{
strcat((char*)dstpathname,(const char*)"/");//目标路径加斜杠
strcat((char*)dstpathname,(const char*)fn); //目标路径加文件名
strcat((char*)srcpathname,(const char*)fn); //源路径加文件名
fcpymsg(fn,0,0X01);//更新文件名
res=exf_copy(fcpymsg,srcpathname,dstpathname,*totsize,*cpdsize,fwmode);//复制文件
*cpdsize+=finfo->fsize;//增加一个文件大小
}
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;
} |
|