kbmmw 中虚拟文件操作入门

简介: kbmmw 中一直有一个功能,但是基本上都没有提过,但是在实际应用中,却非常有用,这个功能就是 虚拟文件包功能,他可以把一大堆文件保存到一个文件里面,方便后台管理。      kbmmw 的虚拟文件在单元kbmMWStreamStore 中实现,这个是非控件形式的,因此需要手工添加这个 单元。

     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;

运行程序,与没有加密的运行效果一致,但是生成的文件已经被加密。

别人即使偷走文件,也不用担心信息泄露了。

 

目录
相关文章
|
5月前
|
存储 Linux 调度
【看表情包学Linux】系统下的文件操作 | 文件系统接口 | 系统调用与封装 | open,write,close 接口 | 系统传递标记位 O_RDWR,O_RDONLY,O_WRONLY...
【看表情包学Linux】系统下的文件操作 | 文件系统接口 | 系统调用与封装 | open,write,close 接口 | 系统传递标记位 O_RDWR,O_RDONLY,O_WRONLY...
40 1
|
30天前
|
存储 安全 Linux
【Linux 创建临时文件 API】编程中的瞬息之光:临时文件的艺术与智慧 tmpnam,tmpfile,mkstemp,mkdtemp等函数解析...
【Linux 创建临时文件 API】编程中的瞬息之光:临时文件的艺术与智慧 tmpnam,tmpfile,mkstemp,mkdtemp等函数解析...
24 0
|
1月前
|
存储 运维 搜索推荐
深入理解文件系统与文件操作:从基础概念到高级用法
深入理解文件系统与文件操作:从基础概念到高级用法
|
C# Windows
☀️ 学会编程入门必备 C# 最基础知识介绍—— C# 高级文件操作(文本文件的读写、二进制文件的读写、Windows 文件系统的操作)
前言🙏 C# 文本文件的读写👇 StreamWriter 类 C# 二进制文件的读写👏 BinaryReader 类 BinaryWriter 类 C# Windows 文件系统的操作👋 DirectoryInfo 类 FileInfo 类
☀️ 学会编程入门必备 C# 最基础知识介绍—— C# 高级文件操作(文本文件的读写、二进制文件的读写、Windows 文件系统的操作)