OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6435|回复: 1

用STM32F103RCT6芯片,FATFS文件系统复制文件和文件夹,对比复制的文件总和原文件有几个字节的差异,200多K的文件有7个字节差异

[复制链接]

1

主题

1

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2017-11-26
在线时间
6 小时
发表于 2017-12-18 10:10:14 | 显示全部楼层 |阅读模式
1金钱
用STM32F103RCT6芯片,SDIO口接TF卡1,SPI2接TF卡2,SDIO口的FATFS接口程序移植于战舰精英板的fatfs例程,SPI2口的FATFS接口程序移植于战舰MINI板的fatfs例程,从卡1复制文件夹到卡2,发现复制到卡2的文件与卡1的文件存在几个字节的差异

差异如下:

246K的图片存在7个字节的差异

246K的图片存在7个字节的差异

246K的jpg文件存在7个字节的差异


447K的PDF文件存在77字节差异

447K的PDF文件存在77字节差异

447K的PDF文件存在77字节差异

320K的word文件没有差异

320K的word文件没有差异

320K的word文件没有差异


6649K的MP3文件存在726字节的差异

6649K的MP3文件存在726字节的差异

6649K的MP3文件存在726字节的差异


求原子哥和大神们这是哪里出问题了。。。。复制文件夹函数采用原子哥提供的
//文件复制
//将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;

if(fwmode==0)
         fwmode=FA_CREATE_NEW;                                                   //不覆盖
else
         fwmode=FA_CREATE_ALWAYS;                                          //覆盖存在的文件

res=f_open(file,(const TCHAR*)psrc,FA_READ|FA_OPEN_EXISTING); //打开只读文件
if(res==0)
           res=f_open(ftemp,(const TCHAR*)pdst,FA_WRITE|fwmode);   //第一个打开成功,才开始打开第二个
if(res==0)                                                                                                       //两个都打开成功了
{
   while(res==0)                                                                                                //开始复制
   {
          res=f_read(file,fatbuf,512,(UINT*)&br);                                   //源头读出512字节
          if(res||br==0)break;
          res=f_write(ftemp,fatbuf,(UINT)br,(UINT*)&bw);                        //写入目的文件
          if(res||bw<br)break;      
  }
  f_close(file);
  f_close(ftemp);
  }
  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);  //源路径加上子目录名字
       res=mf_dcopy(srcpathname,dstpathname,fwmode); //拷贝文件夹
     }
         else //非目录
     {
       strcat((char*)dstpathname,(const char*)"/");//目标路径加斜杠
       strcat((char*)dstpathname,(const char*)fn); //目标路径加文件名
       strcat((char*)srcpathname,(const char*)fn); //源路径加文件名
       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;   
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-19 00:45:23 | 显示全部楼层
先确定是读的问题,还是写的问题?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-23 18:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表