嵌入式编程中boot和app的s19简易合并方法(使用mfc编程)

嵌入式中boot和app为两个项目,使用手动合并方式较慢,如何使用mfc编写程序实现自动合并

1.实现逻辑,首先将boot.s19和app.s19拷贝一份

CommonCopyFile((CString)(app_out_name),(CString)_T(app_own_name));//
CommonCopyFile((CString)(boot_out_name),(CString)_T(boot_own_name));

app_own_name和boot_own_name为各自所在文件夹地址

例如

#define app_own_name "app1.s19"
#define boot_own_name "boot1.s19"

//CommonCopyFile为拷贝函数,忘记参考哪位博主的体帖子了,

//程序如下

BOOL CommonCopyFile(CString sourceFileName, CString DestFileName)
{
     CFile sourceFile ;
     CFile destFile ;
     CFileException ex;
    if (!sourceFile.Open((LPCTSTR)sourceFileName,CFile::modeRead | CFile::shareDenyWrite, &ex))
    {
        TCHAR szError[1024];
        ex.GetErrorMessage(szError, 1024);
        CString ErrorMsg = _T("打开文件:") ;
        ErrorMsg += sourceFileName ;
        ErrorMsg += "失败。n错误信息为:n" ;
        ErrorMsg += szError ;
        AfxMessageBox(ErrorMsg);
        return FALSE ;
    }
    else
    {
         if (!destFile.Open((LPCTSTR)DestFileName, CFile::modeWrite | CFile::shareExclusive | CFile::modeCreate, &ex))
         {
             TCHAR szError[1024];
             ex.GetErrorMessage(szError, 1024);
             CString ErrorMsg =_T("创建文件:")  ;
             ErrorMsg += DestFileName ;
             ErrorMsg += "失败。n错误信息为:n" ;
             ErrorMsg += szError ;
             AfxMessageBox(ErrorMsg);
             sourceFile.Close();
             return FALSE ;
         }

         BYTE buffer[4096];
         int dwRead;
         do
         {
             dwRead = sourceFile.Read(buffer, 4096);
             destFile.Write(buffer, dwRead);
         }
         while (dwRead > 0); 
         destFile.Close();
         sourceFile.Close();
    }
 return TRUE ;
}

2.创建一个合并的文件

CFile destFile ;//合并文件的写入句柄
    Write_File(destFile,buffer,j,(CString)boot_and_app_name,1);//打开boot

//Write_File的程序如下,主要为创建文件

BOOL Write_File(CFile &destFile ,unsigned char* buffer,int length, CString DestFileName,char flag)
{
     CFile sourceFile ;
     //CFile destFile ;
     CFileException ex;
     int i = 0;
     if(1 == flag)
     {
        if (!destFile.Open((LPCTSTR)DestFileName, CFile::modeWrite | CFile::shareExclusive | CFile::modeCreate, &ex))
        {
            TCHAR szError[1024];
            ex.GetErrorMessage(szError, 1024);
            CString ErrorMsg =_T("创建文件:")  ;
            ErrorMsg += DestFileName ;
            ErrorMsg += "失败。n错误信息为:n" ;
            ErrorMsg += szError ;
            AfxMessageBox(ErrorMsg);
            sourceFile.Close();
            return FALSE ;
        }
        return TRUE;
     }
     else if(2 == flag)
     {
        destFile.Close();
        return TRUE;
     }
     
    if(1)
    {
         
            int dwRead = 1;
            destFile.Write((buffer), length);
            #if 0
            do
            {    
            
                //dwRead = sourceFile.Read(buffer, 4096);
                destFile.Write((buffer+i), dwRead);
                i++;
            }
            while (buffer[i] != 0); 
            #endif
             
    }
 return TRUE ;
}

3.打开拷贝boot中s0和s1之前的s19文件

hFileboot = CreateFile((CString)boot_own_name,
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_ALWAYS,
        FILE_SHARE_READ,
        NULL);
    #if 1
    do
    { 
        j = 0;
        bRet = ReadFile(hFileboot, s19, BUFSIZE, (LPDWORD)&dwReadSize, NULL);
        for(i = 0;i< dwReadSize;i++)
        {
            if(('S'== s19[i])&&('2'== s19[i+1]))//截至boot的s2
            {
                k =i;
                break;
            }
            buffer[j++] = s19[i];
        }
        Write_File(destFile,buffer,j,(CString)boot_and_app_name,0);//合并文件的写入句柄
    }while((dwReadSize)&&(!k));

4.将app中除去s0开头和s9结尾的的文件全部拷贝

hFile = CreateFile((CString)app_own_name,
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_ALWAYS,
        FILE_SHARE_READ,
        NULL);
    bRet = ReadFile(hFile, s19, BUFSIZE, (LPDWORD)&dwReadSize, NULL);
    
    //CloseHandle(hFile);
    
    //buffer.Format(dwReadSize);
    //sprintf((char)buffer,"%d",dwReadSize);
    //STATE_TXT.SetWindowTextW((buffer));
    //change::int_to_char((char*)&buffer,(unsigned int)dwReadSize);
    //change::int_to_char((char*)buffer,(unsigned int)dwReadSize);

    

    for(i = 0;i < dwReadSize;i++)//找出s1开头存入数组
    {
        if((s19[i] == 13)&&(s19[i+1] == 10))
        {
            break;
        }
    }
    i += 2;//移动到下一位置
    j = 0;
    for(;i < dwReadSize;i++)
    {
        if(('s'== s19[i])&&('9'== s19[i+1]))
        {
            break;
        }
        buffer[j++] = s19[i];    
    }
    
    Write_File(destFile,buffer,j,(CString)boot_and_app_name,0);
    do
    {
        j = 0;
        bRet = ReadFile(hFile, s19, BUFSIZE, (LPDWORD)&dwReadSize, NULL);
        #if 0
        unsigned char temp[100];
        change::int_to_char((char*)&temp,(unsigned int)dwReadSize);
        STATE_TXT.SetWindowTextW((LPCTSTR)(temp));
        #endif
        for(i = 0;i < dwReadSize;i++)
        {
            if(('S'== s19[i])&&('9'== s19[i+1]))
            {
                i = dwReadSize+1;
                break;
            }
            buffer[j++] = s19[i];
        
        }
        Write_File(destFile,buffer,j,(CString)boot_and_app_name,0);
    }while(dwReadSize&&(i <= dwReadSize));

5.再接着拷贝boot中剩余部分

CloseHandle(hFileboot);//关闭重开是为了查找接下来的位置
    hFileboot = CreateFile((CString)boot_own_name,
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_ALWAYS,
        FILE_SHARE_READ,
        NULL);
    k = 0;
    do
    { 
        j = 0;
        bRet = ReadFile(hFileboot, s19, BUFSIZE, (LPDWORD)&dwReadSize, NULL);
        
        for(i = 0;i< dwReadSize;i++)//找出接下boot的位置
        {
            if(('S'== s19[i])&&('2'== s19[i+1]))
            {
                k =1;
            }
            if(1==k)
            {
                buffer[j++] = s19[i];
            }
        }
        Write_File(destFile,buffer,j,(CString)boot_and_app_name,0);//合并文件的写入句柄
    }while((dwReadSize));
    Write_File(destFile,buffer,j,(CString)boot_and_app_name,2);
    CloseHandle(hFileboot);
    CloseHandle(hFile);

软件链接https://download.csdn.net/download/qq_43683623/73461376

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值