关于文件捆绑,分离的问题. ( 积分: 30 )

  • 主题发起人 主题发起人 我要学
  • 开始时间 开始时间

我要学

Unregistered / Unconfirmed
GUEST, unregistred user!
我在DFW上看到这样的一些代码.

合并

Function Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
var
Target,Source:TFileStream;
MyFileSize:integer;
begin
try
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareExclusive);
Target:=TFileStream.Create(TargetFile,fmOpenWrite or fmShareExclusive);
try
Target.Seek(0,soFromEnd);//往尾部添加资源
Target.CopyFrom(Source,0);
MyFileSize:=Source.Size+Sizeof(MyFileSize);//计算资源大小,并写入辅程尾部
Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));
finally
Target.Free;
Source.Free;
end;
except
Result:=False;
Exit;
end;
Result:=True;
end;


分离
Function Cjt_LoadFromFile(SourceFile,TargetFile :string):Boolean;
var
Source:TFileStream;
Target:TMemoryStream;
MyFileSize:integer;
begin
try
Target:=TMemoryStream.Create;
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
try
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源大小
Source.Seek(-MyFileSize,soFromEnd);//定位到资源位置
Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));//取出资源
Target.SaveToFile(TargetFile);//存放到文件
finally
Target.Free;
Source.Free;
end;
except
Result:=false;
Exit;
end;
Result:=true;
end;

现在的问题是我只能分离出最后一个合并的文件.

假如我将 C.EXE 合并到 A.EXE ;再将 B.EXE 合并到 A.EXE ;

而我只能分离出B.EXE.

C.EXE如何分离
 
我在DFW上看到这样的一些代码.

合并

Function Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
var
Target,Source:TFileStream;
MyFileSize:integer;
begin
try
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareExclusive);
Target:=TFileStream.Create(TargetFile,fmOpenWrite or fmShareExclusive);
try
Target.Seek(0,soFromEnd);//往尾部添加资源
Target.CopyFrom(Source,0);
MyFileSize:=Source.Size+Sizeof(MyFileSize);//计算资源大小,并写入辅程尾部
Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));
finally
Target.Free;
Source.Free;
end;
except
Result:=False;
Exit;
end;
Result:=True;
end;


分离
Function Cjt_LoadFromFile(SourceFile,TargetFile :string):Boolean;
var
Source:TFileStream;
Target:TMemoryStream;
MyFileSize:integer;
begin
try
Target:=TMemoryStream.Create;
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
try
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源大小
Source.Seek(-MyFileSize,soFromEnd);//定位到资源位置
Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));//取出资源
Target.SaveToFile(TargetFile);//存放到文件
finally
Target.Free;
Source.Free;
end;
except
Result:=false;
Exit;
end;
Result:=true;
end;

现在的问题是我只能分离出最后一个合并的文件.

假如我将 C.EXE 合并到 A.EXE ;再将 B.EXE 合并到 A.EXE ;

而我只能分离出B.EXE.

C.EXE如何分离
 
一天了,UP的人都没有,进来的兄弟顶一下吧
 
10天了,UP的人都没有,进来的兄弟顶一下吧
 
谁说话给谁分, 可怜
 
我也想学习学习
 
我也想学这方面的问题呢,现在一些程序,将文件可以保存为任何后缀名的文件,比如ABC.DVC,123.AAA,然后打开这个文件的时候,就可以将这些数据全部加入进来.这些技术应该就是用到了楼上所说的东西,这到底是怎么实现的呢..
 
Function Cjt_LoadFromFile2(SourceFile,TargetFile :string):Boolean;
var
Source:TFileStream;
Target:TMemoryStream;
MyFileSize1, MyFileSize2:integer;
begin
try
Target:=TMemoryStream.Create;
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
try
Source.Seek(-sizeof(MyFileSize2),soFromEnd);
Source.ReadBuffer(MyFileSize2,sizeof(MyFileSize2));//读出第二个资源大小
Source.Seek(-MyFileSize2-sizeof(MyFileSize1),soFromEnd);
Source.ReadBuffer(MyFileSize1,sizeof(MyFileSize1));//读出第一个资源大小
Source.Seek(-MyFileSize1-MyFileSize2),soFromEnd);
Target.CopyFrom(Source,MyFileSize1-sizeof(MyFileSize1));//取出资源
Target.SaveToFile(TargetFile);//存放到文件
finally
Target.Free;
Source.Free;
end;
except
Result:=false;
Exit;
end;
Result:=true;
end;
 
楼上,SourceFile,TargetFile分别对应什么文件呀.谢谢.....
 
kaida的方法可行,我正需要呢,多谢!
楼主,该给kaida分了
 
nIndex参数表示你要取第几个文件

function TForm1.Cjt_LoadFromFile(SourceFile, TargetFile: string; nIndex: Integer): Boolean;
var
Source: TFileStream;
Target: TMemoryStream;
nFileSize, nPos: integer;
Index_: Integer;// 表示现在已经取到的位置
begin
try
Target := TMemoryStream.Create;
Source := TFileStream.Create(SourceFile, fmOpenRead or fmShareDenyNone);
try
nPos := 0;// 当前的位置,从0开始读取
Index_ := 0;
while Index_ <= nIndex do begin
Source.Seek(-nPos -Sizeof(Integer), soFromEnd); // 流的结尾放了一个Integer位置的空间,存放下面将要取的流的大小
Source.ReadBuffer(nFileSize, Sizeof(Integer)); //读出资源大小, 取这个值的大小
Inc(Index_);
Inc(nPos, nFileSize); // 取下一个位置
end;
Source.Seek(nFileSize - nPos, soFromEnd); //定位到资源位置
// [blue]没有仔细测过,如果有问题可能是nFileSize前面是否为负[/blue]
Target.CopyFrom(Source, nFileSize - Sizeof(Integer)); //取出资源

Target.SaveToFile(TargetFile); //存放到文件
finally
Target.Free;
Source.Free;
end;
except
Result := False;
Exit;
end;
Result := True;
end;
 
TO chenybin

你真是一个热心的富翁

很感激,
 
后退
顶部