kbmmw 中虛擬文件操做入門

     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;

運行程序,與沒有加密的運行效果一致,可是生成的文件已經被加密。

別人即便偷走文件,也不用擔憂信息泄露了。

相關文章
相關標籤/搜索