请教:“文件→OleContainer→Stream→数据库”,如何还原出文件? ( 积分: 200 )

  • 主题发起人 主题发起人 赵抄
  • 开始时间 开始时间
to yuyuhaso1:
原因不是你说的那样。
 
to 赵抄:
为何不用OleContainer的savetofile?
 
那么就是你存的时候有问题。
http://free.ys168.com/?yuyuhaso
我的这个是可以正常工作的,要不你看看
 
保存时跳过ole的头即可!
如:
stream内容为BMP的ole流时
stream.postion:=28;
filestream.copyfrom(stream,0);
filestream.savetofile('test.bmp');
 
TO ZZHI:
我看了几种不同类型的文件,Ole的头不一样大,所以你的方法不具有通用性。
不过,能解决部分问题也很好,谢谢您。
 
帮顶

--------签名档---------------------------

惊爆开源站

http://www.source520.com

80G源码电子书免费免注册下载,大量精辟技术文档库随时更新
 
问题还是得自己解决。
发布答案并散分,谢谢大家的热心帮助!

function ScanStream(T :TStream; S :string):Integer;
var
i,j:Integer;
p:Pchar;
lSize:Int64;
begin
T.Position := 0;
lSize := T.Size;
Result := 0;
GetMem(p,lSize);
T.ReadBuffer(p^,lSize);
for i := 0 to lSize -1 do
begin
for j:=1 to Length(S) do
if p[i+j]<>S[j] then Break;
if j>length(S) then
begin
Result:=i+1;
Break;
end;
end;
FreeMem(p);
end;

procedure UnpachPDFOleStreamToFile(T :TStream; AFileName :string);
var
lOutStream :TMemoryStream;
lStart,lEnd,lPDFSize : Integer;
lStartStr,lEndStr : String;
begin
lStartStr := '%PDF';
lStart := ScanStream(T,lStartStr);
lEndStr := '%%EOF';
lEnd := T.Size;
lPDFSize := lEnd - lStart;
if lPDFSize > 0 Then
begin
lOutStream := TMemoryStream.Create;
T.Seek(lStart,soFromBeginning);
lOutStream.CopyFrom(T,Int64(lPDFSize));
lOutStream.SaveToFile(AFileName);
lOutStream.Free;
end;
end;
 
多人接受答案了。
 
后退
顶部