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=0 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:=0 to sl.Count-1 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=0 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:=0; 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:=0 to sl.Count-1 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;
运行程序,与没有加密的运行效果一致,但是生成的文件已经被加密。
别人即使偷走文件,也不用担心信息泄露了。