最近碰到一个问题,我要做一个软件的安装程序,需要在安装的时候播放flash的动画,完全用flash做安装界面,没有现成的安装工具可以使用。于是决定自己写一个安装程序。初步决定的方案是用zipforge来解压缩附在一个exe尾巴上的zip文件以实现软件安装。但是这就需要zipforge从一个大文件的中间开始解压缩zip,而不是从开头。
因为文件比较大(大约425M),所以加载进内存进行分割是不现实的,而且这样也会浪费内存或者硬盘空间,zipforge可以从一个stream中解压文件,可是filestream无法实现偏移读取,我想从Tfilestream继承一个新类来实现偏移读取文件的开端,但是不知道给怎么实现。请大家给些建议,谢谢了!
因为文件比较大(大约425M),所以加载进内存进行分割是不现实的,而且这样也会浪费内存或者硬盘空间,zipforge可以从一个stream中解压文件,可是filestream无法实现偏移读取,我想从Tfilestream继承一个新类来实现偏移读取文件的开端,但是不知道给怎么实现。请大家给些建议,谢谢了!
解决方案 »
- Delphi中SaveDialog如何只显示文件名中含有特定字符的文件
- 放个好东西给大家,DIRegEx_5.2.0_Source,绝对正综的pcre for delphi
- C++ 写的dll中的结构体参数,Delphi在调用时应如何赋值
- 请教高手如何改变MainMenu的字体?
- 直接用TWAIN.DLL控制扫描仪的程序
- Forms单元
- idhttp的下载中窗体没有响应
- 动态皮肤更换的N种方法——你会那种?[看你的回答质量给分]
- "xp+d7" 出现大白窗口,程序好像被挂起,我已经重装过系统 w2k 没有这个现象,请问如何入手解决
- 拨号连接到ORACLE8,在程序打开数据库后,如果掉线了,重新拨上后在程序中执行数据库操作则报错,在不重新打开程序的情况下,怎样自动重新连接数据库
- 请教delphi + intrabweb 问题
- 帮忙看看这里的错误怎么解决?
procedure TForm1.Button1Click(Sender: TObject);
var
vBuffer: array[0..255] of Char;
begin
with TFileStream.Create(ParamStr(0), fmShareDenyNone) do try
Seek($50, soBeginning);
Read(vBuffer, SizeOf(vBuffer));
ShowMessage(vBuffer);
finally
Free;
end;
end;
最好的办法还是把zipforge骗过去,代价最小,就是对继承不太熟而已。
var
AReadStream:TFileStream;
Buf:Array[0..127] of Byte;
CurPos:Int64;
ReadCount,J:Integer;
str:string; //把数组buf里的数据用string表示
begin
Datalist:=Tstringlist.Create;
begin
AReadStream:=TFileStream.Create(loadfilename,fmOpenRead);
try
AReadStream.Position:=0;
CurPos:=0;
While CurPos<AReadStream.Size do
begin
str:='';
ReadCount:=AReadStream.Read(Buf,64);
if ReadCount<=0 then Break;
for J:=0 to 63 do // 将数据写到TstringList 里
str:=str+BytetoHex(Buf[J]);
DataList.add(str);
CurPos:=CurPos+64; //偏移量为64字节
end;
finally
AReadStream.Free;
end;
end;
end;
记得给加分啊
private
fOffset: Integer; // 用来保存偏移地址
public
function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
end;function TOffSetFileStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
begin
if Origin = soBeginning then
Result := inherited Seek(Offset + fOffset, Origin)
else
Result := inherited Seek(Offset, Origin);
end;