嵌入式中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);