文件中要插入数据,还需要保持原来的格式可以覆盖,但是不能忽略插入以后的数据?最近客户有这样的一个需求,本来我们的文件读取是以二进制流的方式读取和写入的,客户变更了方法,我们该如何解决呢?数据文件还需要上传,下载,命名都和原来文件一致.
为了解决这个问题,我们需要解决一下几个问题:
a.目标文件内容的获取,上传服务器.
b.目标文件的下载,比对原文件,覆盖原文件相同部分内容
c.目标文件的插入.
d后续文件的继续写入.
1.文件的读取,写入方式,我们改为TEXT模式,为了方便查收需要的数据段.
文件上传的时候,备份源文件到指定的目录下,只获取客户需要的数据段,客户看不到备份 的隐藏文件.
BOOL ReadLocalRecipeInfor(CString strRecipeName,BYTE* &dataInfor,long& size)
{
CString strpath=;
CString strFile = strpath+_T(".*");//GetAbsolutePathName(PACKAGE) + strRecipeName+_T(".pkg") ;
CString strbackUpFile=GetAbsolutePathName(BACKUPPACKAGE) + strRecipeName+_T(".*"");
try
{
if(!file.Open(strFile,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::typeText/*typeBinary*/,&e))
{
return FALSE;
}
UINT fileSize=0;
fileSize=file.GetLength();
size=fileSize;
dataInfor =new BYTE[fileSize+1];
file.Read(dataInfor,fileSize);
file.Close();
CopyFile(strFile,strbackUpFile,FALSE);
}
catch(CException* e)
{
CString strEror=L"error exception...";
printf((char*)(LPCTSTR)strEror);
}
2.获取目标文件内容,涉及到文件开始,结束.(这个目标文件的位置,新建再多每一个都是一样的位置 )
下载数据的时候,我们后台把对应的源文件数据复制到目标文件夹中,查找到下载数据的起始位,设置位当前位置,写入数据即可.
3.数据上传,下载.
BOOL WriteLocalRecipeInfor(CString strRecipeName,const BYTE* pRecipeDatas,long nsize)
{
if(nsize<=0)
{
return FALSE;
}
try
{
CString strFile = GetAbsolutePathName(PACKAGE) + strRecipeName+_T(“.“) ;
CString stroldFile=GetAbsolutePathName(BACKUPPACKAGE) + strRecipeName+_T(”.”);
CopyFile(stroldFile,strFile,FALSE);
CStdioFile file;
CFileException e;
CFileFind fileFind;
fileFind.FindFile();
if(!file.Open(strFile,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::typeText/*typeBinary*/,&e))
{
return FALSE;
}
UINT fileSize=0;
long len;
int stpos;
BYTE* dataFile;
BYTE* needData;
dataFile=new BYTE[1000];
file.Read(dataFile,1000);
TransForByteString(1000,dataFile,needData,len,stpos,sepos);
file.Seek(stpos,SEEK_CUR);
file.Write(pRecipeDatas,nsize);
//file.WriteString(dataInfor);
file.Close();
if(needData!=NULL)
{
delete [] needData;
needData =NULL;
}
if(dataFile!=NULL)
{
delete [] dataFile ;
dataFile =NULL;
}
}
catch(CException* e)
{
CString strEror=L"error exception...";
printf((char*)(LPCTSTR)strEror);
}
4.下载的数据插入到文件中.
file.Seek(stpos,SEEK_CUR);数据插入的位置,这样我们就可以保持原来文件不变,只替换新写入的内容.