我需要用b程序对a程序配置,把任意一个图片文件和文本文件写到a程序里,a程序发布出去后,里面带b程序对他写如的图片文件跟文本文件。  
 
下面是b程序的配置代码:  
var  
   Target,str:TFilestream;  
   Size:Integer;  
   sr:  TSearchRec;  
Begin  
   FindFirst('d:\a.exe',  faAnyFile,  sr);  
   if  (sr.Size  div  1024)  >  500  then  
   begin  
       showmessage('已经添加好了!');  
       exit;  
   end;  
   try  
       //写如图片  
       str:=TFileStream.Create('My.bmp',fmOpenRead  or  fmShareExclusive);  
       Target  :=  TFilestream.create('d:\a.exe',  fmOpenWrite  or  fmShareExclusive);  
       Target.Seek(0,soFromEnd);  
       //往辅程序的尾部添加资源  
       Target.CopyFrom(str,0);  
       Size:=str.Size  +  Sizeof(Size);  
       //计算资源大小,并写入辅程序尾部  
       Target.WriteBuffer(Size,Sizeof(Size));  
       Target.Free;  
       str.Free;  
       //写入文字  
       str:=TFileStream.Create('1.txt',fmOpenRead  or  fmShareExclusive);  
       Target  :=  TFilestream.create('d:\a.exe',  fmOpenWrite  or  fmShareExclusive);  
       Target.Seek(0,soFromEnd);  
       //往辅程序的尾部添加资源  
       Target.CopyFrom(str,0);  
       Size:=str.Size  +  Sizeof(Size);  
       //计算资源大小,并写入辅程序尾部  
       Target.WriteBuffer(Size,Sizeof(Size));  
   finally  
       Target.Free;  
       str.Free;  
   end;  
 
上面的代码能成功的把图片文件跟文本文件写到a里。  
 
再看a的读出配置文件的代码  
var  
   Source:TFilestream;  
   str:TMemoryStream;  
   Size:Integer;  
Begin  
   try  
       str:=TMemoryStream.Create;  
       Source  :=  TFilestream.create(Application.ExeName,  fmOpenRead  or  fmShareDenyNone);  
       Source.Seek(-Sizeof(Size),soFromEnd);  
       //读出资源大小  
       Source.ReadBuffer(Size,SizeOf(Size));  
       //定位到资源的开始位置  
       Source.Seek(-Size,soFromEnd);  
       //取出资源并存到文件中  
       str.CopyFrom(Source,Size  -  SizeOf(Size));  
       str.SaveToFile('1.txt');  
       //显示  
       Memo1.Lines.LoadFromFile('1.txt');  
 
   Finally  
       str.Free;  
       Source.Free;  
   end;  
 
该段代码能成功的把  添加到尾端的文本文件读出,当是图片文件没办法读出来,有什么方法能把图片文件跟文本文件都分解出来哈,上面的代码原本是我辛苦找的,但只能添加一个文件,现在我需要加2个文件,但对流的造作不熟悉,不知道怎么改好,大虾救救俺呀,

解决方案 »

  1.   

    很多朋友告诉重新读1次就能读到图片位置了,其实思路我也懂,但对流的操作真的不会。 比如写入的时候是Target.Seek(0,soFromEnd);  读取文件的时候,Source.Seek(-Sizeof(Size),soFromEnd);    这个seek的第一参数取0跟取-sizeof(size)到底有什么区别,具体什么意义,我都不明白。    怎么通过代码来实现我不会,实在是对流的操作不懂。 希望VC区的大虾能给写能参考的代码。
      

  2.   

    要存储多个附加文件,你可以这样处理
    文件a的结构:
    文件a数据 + 文件1大小 + 文件1数据 + 文件2大小 + 文件2数据 + … + “文件1大小”的偏移量读取的时候,先从末尾读到附加数据的偏移量,然后seek到“文件1大小”出,
    读取文件1的大小,接着按这个尺寸读取文件1的数据,
    然后接着读取文件2的大小,再按这个尺寸读取文件2的数据,
    这样一直重复到文件末尾
      

  3.   

    在你原来代码上,添加一段读取代码就行了var
    Source:TFilestream;
    str:TMemoryStream;
    Size:Integer;
    Begin
    try
    str:=TMemoryStream.Create;
    Source := TFilestream.create(Application.ExeName, fmOpenRead or fmShareDenyNone);
    Source.Seek(-Sizeof(Size),soFromEnd);
    //读出资源大小
    Source.ReadBuffer(Size,SizeOf(Size));
    //定位到资源的开始位置
    Source.Seek(-Size,soFromEnd);
    //取出资源并存到文件中
    str.CopyFrom(Source,Size - SizeOf(Size));
    str.SaveToFile('1.txt');
    //显示
    Memo1.Lines.LoadFromFile('1.txt');//添加begin---------------------------
    //清除str
    str.Clear;
    //定位到资源大小的位置
    Source.Seek(-(Size+Sizeof(Size)),soFromEnd);
    //读出资源大小
    Source.ReadBuffer(Size,SizeOf(Size));
    //定位到资源的开始位置
    Source.Seek(-Size,soFromCurrent);
    //取出资源并存到文件中
    str.CopyFrom(Source,Size - SizeOf(Size));
    str.SaveToFile('My.bmp');
    //添加end---------------------------Finally
    str.Free;
    Source.Free;
    end;
      

  4.   

    谢谢楼上的大虾,真是不知道怎么感激你喔。 
    用现在最流行的一句话,你真是太有才了(呵呵,真是还厉害哇)
    我在其他地方还有2个贴子,帮忙来领分。
    http://community.csdn.net/Expert/topic/5426/5426569.xml?temp=.8106958
    http://community.csdn.net/Expert/topic/5426/5426594.xml?temp=.7624781