kbmmw 中一直有一個功能,可是基本上都沒有提過,可是在實際應用中,卻很是有用,這個功能就是加密
虛擬文件包功能,他能夠把一大堆文件保存到一個文件裏面,方便後臺管理。spa
kbmmw 的虛擬文件在單元kbmMWStreamStore 中實現,這個是非控件形式的,所以須要手工添加這個3d
單元。另外虛擬文件操做的類爲TkbmMWLookupStorage,全部的操做都由這個類實現,具體能夠參加源碼。code
由於這個很簡單,直接就上界面orm
具體實現代碼以下blog
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 個文件string
同時在d:\temp 生成了一個so 文件it
打包成功io
列表能夠顯示包裏面的文件
解壓結果
解壓正確。
有的時候咱們爲了保密和減少文件大小,能夠採用加密和壓縮。
下面再演示一下加密的方式。
加入一個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;
運行程序,與沒有加密的運行效果一致,可是生成的文件已經被加密。
別人即便偷走文件,也不用擔憂信息泄露了。