文件中要插入数据,还需要保持原来的格式可以覆盖,但是不能忽略插入以后的数据?最近客户有这样的一个需求,本来我们的文件读取是以二进制流的方式读取和写入的,客户变更了方法,我们该如何解决呢?数据文件还需要上传,下载,命名都和原来文件一致.
为了解决这个问题,我们需要解决一下几个问题:
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);数据插入的位置,这样我们就可以保持原来文件不变,只替换新写入的内容.