kbmmw 中一直有一个功能,但是基本上都没有提过,但是在实际应用中,却非常有用,这个功能就是
虚拟文件包功能,他可以把一大堆文件保存到一个文件里面,方便后台管理。
kbmmw 的虚拟文件在单元kbmMWStreamStore 中实现,这个是非控件形式的,因此需要手工添加这个
单元。另外虚拟文件操作的类为TkbmMWLookupStorage,所有的操作都由这个类实现,具体可以参加源码。
因为这个很简单,直接就上界面
具体实现代码如下
procedure TForm2.Button1Click(Sender: TObject);// 打包
var
sr:TSearchRec;
i:integer;
fs:TFileStream;
fsfile:TFileStream;
st:TkbmMWLookupStorage;
begin
fs:=TFileStream.Create(edit2.Text,fmCreate or fmOpenReadWrite);
try
st:=TkbmMWLookupStorage.Create(fs);
try chdir(edit1.Text);
i:=FindFirst('*.*',faNormal,sr);
while i= do
begin
try
fsfile:=TFileStream.Create(sr.Name,fmOpenRead or fmShareCompat);
try
st.Add(sr.Name,fsfile);
finally
fsfile.Free;
end;
except
end;
i:=FindNext(sr);
end;
finally
st.Free;
end;
finally
fs.Free;
end; showmessage('打包成功'); end; procedure TForm2.Button2Click(Sender: TObject); //列目录
var
fs:TFileStream;
st:TkbmMWLookupStorage;
begin
fs:=TFileStream.Create(edit2.text,fmOpenReadWrite);
try
st:=TkbmMWLookupStorage.Create(fs);
try
Label1.Caption:=inttostr(st.Count);
st.GetIdentifiers(ListBox1.Items);
finally
st.Free;
end;
finally
fs.Free;
end; end; procedure TForm2.Button3Click(Sender: TObject);//解压文件
var
i:integer;
fs:TFileStream;
fsfile:TFileStream;
st:TkbmMWLookupStorage;
sl:TStringList;
s:string;
begin
fs:=TFileStream.Create(edit2.Text,fmOpenReadWrite);
try
st:=TkbmMWLookupStorage.Create(fs);
try
sl:=TStringList.Create;
try
st.GetIdentifiers(sl);
for i:= to sl.Count- do
begin
s:=sl.Strings[i];
fsfile:=TFileStream.Create(edit3.Text+s,fmCreate or fmOpenWrite);
try
st.Get(s,fsfile);
finally
fsfile.Free;
end;
end; finally
sl.Free;
end;
finally
st.Free;
end;
finally
fs.Free;
end; showmessage('解包成功!'); end;
运行效果
可以看见一共319 个文件
同时在d:\temp 生成了一个so 文件
打包成功
列表可以显示包里面的文件
解压结果
解压正确。
有的时候我们为了保密和减小文件大小,可以采用加密和压缩。
下面再演示一下加密的方式。
加入一个kbmmwcrypt和两个按钮。
对应的代码如下:
procedure TForm2.Button4Click(Sender: TObject); //加密打包
var
sr:TSearchRec;
i:integer;
ms:Tbytesstream;
fs:TFileStream;
fsfile:TFileStream;
st:TkbmMWLookupStorage;
begin
fs:=TFileStream.Create(edit2.Text,fmCreate or fmOpenReadWrite); ms:=TbytesStream.Create; try
st:=TkbmMWLookupStorage.Create(ms);
try chdir(edit1.Text);
i:=FindFirst('*.*',faNormal,sr);
while i= do
begin
try
fsfile:=TFileStream.Create(sr.Name,fmOpenRead or fmShareCompat);
try
st.Add(sr.Name,fsfile);
finally
fsfile.Free;
end;
except
end;
i:=FindNext(sr);
end; kbmMWCrypt1.PassPhrase:='xalion123456';
ms.Position:=;
kbmMWCrypt1.Encrypt(nil,ms,fs); finally
st.Free;
end; finally
fs.Free;
ms.Free;
end; showmessage('打包成功'); end; procedure TForm2.Button5Click(Sender: TObject); // 解密展开
var
i:integer;
fs:TFileStream;
fsfile:TFileStream;
ms:Tbytesstream;
st:TkbmMWLookupStorage;
sl:TStringList;
s:string;
begin
fs:=TFileStream.Create(edit2.Text,fmOpenReadWrite);
ms:=TbytesStream.Create;
kbmMWCrypt1.PassPhrase:='xalion123456';
kbmMWCrypt1.decrypt(nil,fs,ms); try
st:=TkbmMWLookupStorage.Create(ms);
try
sl:=TStringList.Create;
try
st.GetIdentifiers(sl);
for i:= to sl.Count- do
begin
s:=sl.Strings[i];
fsfile:=TFileStream.Create(edit3.Text+s,fmCreate or fmOpenWrite);
try
st.Get(s,fsfile);
finally
fsfile.Free;
end;
end; finally
sl.Free;
end;
finally
st.Free;
end;
finally
fs.Free;
end; showmessage('解包成功!'); end;
运行程序,与没有加密的运行效果一致,但是生成的文件已经被加密。
别人即使偷走文件,也不用担心信息泄露了。