关于TStream 的使用。(200分)

  • 主题发起人 主题发起人 tanxj
  • 开始时间 开始时间
T

tanxj

Unregistered / Unconfirmed
GUEST, unregistred user!
请各位大哥帮我看看这个代码,怎么会出错?
var
F ,Fw: File;
IStream : TStream;
OStream : TStream;
fsize : int64;
TempBuf : Array of byte;
begin

Istream := TStream.Create;//(FileName,fmOpenRead);//TStream.Create;
OStream := TStream.Create;//(MyPath + '/MP3/'+ 'Temp.swf',fmCreate);
FileMode:=fmOpenRead;
AssignFile(f,'temp.avi');
Reset(f,1);
fsize := Filesize(f);
SetLength(TempBuf,fsize);
BlockRead(f,TempBuf[0],fsize);
//将文件读入内存
CloseFile(f);
IStream.WriteBuffer(TempBuf[0],fsize);
showmessage('写了');
end;

老是提示Abstract error;
 
这是一个抽象的方法,必须在子类实现。否则报abstractError。
 
var
IStream : TStream;
OStream : TStream;
begin

Istream := TFileStream.Create(FileName,fmOpenRead);
OStream := TFileStream.Create(MyPath + '/MP3/'+ 'Temp.swf',fmCreate or fmOpenWrite);
OStream.CopyFrom(IStream, IStream.Size);
IStream.Free;
OStream.Free
end;

 
用TStream的子类就没有这种问题了。比如:TMemoryStream TFileStream.
 
var
F ,Fw: File;
IStream : TStream;
OStream : TStream;
fsize : int64;
TempBuf : Array of byte;
begin

//TStream是纯虚类,就像是TStrings,所以不能用TStream来建立实例对象,
//要用tStream的子类,如tMemorystream, tfilestream, tStringStream
Istream := TStream.Create;//(FileName,fmOpenRead);//TStream.Create;
OStream := TStream.Create;//(MyPath + '/MP3/'+ 'Temp.swf',fmCreate);
FileMode:=fmOpenRead;
AssignFile(f,'temp.avi');
Reset(f,1);
fsize := Filesize(f);
SetLength(TempBuf,fsize);
BlockRead(f,TempBuf[0],fsize);
//将文件读入内存
CloseFile(f);
IStream.WriteBuffer(TempBuf[0],fsize);
showmessage('写了');
end;

 
明白,试试先!
 
如果仅仅是用CopyFrom方法,TStream倒是可以的,只是象Write和Read两个函数是没有实现的。
而WriteBuffer和ReadBuffer又是调用了Write和Read,所以会出错。[:)]
 
后退
顶部