kbmmw 中一直有一个功能,但是基本上都没有提过,但是在实际应用中,却非常有用,这个功能就是

虚拟文件包功能,他可以把一大堆文件保存到一个文件里面,方便后台管理。

kbmmw 的虚拟文件在单元kbmMWStreamStore 中实现,这个是非控件形式的,因此需要手工添加这个

单元。另外虚拟文件操作的类为TkbmMWLookupStorage,所有的操作都由这个类实现,具体可以参加源码。

因为这个很简单,直接就上界面

具体实现代码如下

  1. procedure TForm2.Button1Click(Sender: TObject);// 打包
  2. var
  3. sr:TSearchRec;
  4. i:integer;
  5. fs:TFileStream;
  6. fsfile:TFileStream;
  7. st:TkbmMWLookupStorage;
  8. begin
  9. fs:=TFileStream.Create(edit2.Text,fmCreate or fmOpenReadWrite);
  10. try
  11. st:=TkbmMWLookupStorage.Create(fs);
  12. try
  13.  
  14. chdir(edit1.Text);
  15. i:=FindFirst('*.*',faNormal,sr);
  16. while i= do
  17. begin
  18. try
  19. fsfile:=TFileStream.Create(sr.Name,fmOpenRead or fmShareCompat);
  20. try
  21. st.Add(sr.Name,fsfile);
  22. finally
  23. fsfile.Free;
  24. end;
  25. except
  26. end;
  27. i:=FindNext(sr);
  28. end;
  29. finally
  30. st.Free;
  31. end;
  32. finally
  33. fs.Free;
  34. end;
  35.  
  36. showmessage('打包成功');
  37.  
  38. end;
  39.  
  40. procedure TForm2.Button2Click(Sender: TObject); //列目录
  41. var
  42. fs:TFileStream;
  43. st:TkbmMWLookupStorage;
  44. begin
  45. fs:=TFileStream.Create(edit2.text,fmOpenReadWrite);
  46. try
  47. st:=TkbmMWLookupStorage.Create(fs);
  48. try
  49. Label1.Caption:=inttostr(st.Count);
  50. st.GetIdentifiers(ListBox1.Items);
  51. finally
  52. st.Free;
  53. end;
  54. finally
  55. fs.Free;
  56. end;
  57.  
  58. end;
  59.  
  60. procedure TForm2.Button3Click(Sender: TObject);//解压文件
  61. var
  62. i:integer;
  63. fs:TFileStream;
  64. fsfile:TFileStream;
  65. st:TkbmMWLookupStorage;
  66. sl:TStringList;
  67. s:string;
  68. begin
  69. fs:=TFileStream.Create(edit2.Text,fmOpenReadWrite);
  70. try
  71. st:=TkbmMWLookupStorage.Create(fs);
  72. try
  73. sl:=TStringList.Create;
  74. try
  75. st.GetIdentifiers(sl);
  76. for i:= to sl.Count- do
  77. begin
  78. s:=sl.Strings[i];
  79. fsfile:=TFileStream.Create(edit3.Text+s,fmCreate or fmOpenWrite);
  80. try
  81. st.Get(s,fsfile);
  82. finally
  83. fsfile.Free;
  84. end;
  85. end;
  86.  
  87. finally
  88. sl.Free;
  89. end;
  90. finally
  91. st.Free;
  92. end;
  93. finally
  94. fs.Free;
  95. end;
  96.  
  97. showmessage('解包成功!');
  98.  
  99. end;

运行效果

可以看见一共319 个文件

同时在d:\temp 生成了一个so 文件

打包成功

列表可以显示包里面的文件

解压结果

解压正确。

有的时候我们为了保密和减小文件大小,可以采用加密和压缩。

下面再演示一下加密的方式。

加入一个kbmmwcrypt和两个按钮。

对应的代码如下:

  1. procedure TForm2.Button4Click(Sender: TObject); //加密打包
  2. var
  3. sr:TSearchRec;
  4. i:integer;
  5. ms:Tbytesstream;
  6. fs:TFileStream;
  7. fsfile:TFileStream;
  8. st:TkbmMWLookupStorage;
  9. begin
  10. fs:=TFileStream.Create(edit2.Text,fmCreate or fmOpenReadWrite);
  11.  
  12. ms:=TbytesStream.Create;
  13.  
  14. try
  15. st:=TkbmMWLookupStorage.Create(ms);
  16. try
  17.  
  18. chdir(edit1.Text);
  19. i:=FindFirst('*.*',faNormal,sr);
  20. while i= do
  21. begin
  22. try
  23. fsfile:=TFileStream.Create(sr.Name,fmOpenRead or fmShareCompat);
  24. try
  25. st.Add(sr.Name,fsfile);
  26. finally
  27. fsfile.Free;
  28. end;
  29. except
  30. end;
  31. i:=FindNext(sr);
  32. end;
  33.  
  34. kbmMWCrypt1.PassPhrase:='xalion123456';
  35. ms.Position:=;
  36. kbmMWCrypt1.Encrypt(nil,ms,fs);
  37.  
  38. finally
  39. st.Free;
  40. end;
  41.  
  42. finally
  43. fs.Free;
  44. ms.Free;
  45. end;
  46.  
  47. showmessage('打包成功');
  48.  
  49. end;
  50.  
  51. procedure TForm2.Button5Click(Sender: TObject); // 解密展开
  52. var
  53. i:integer;
  54. fs:TFileStream;
  55. fsfile:TFileStream;
  56. ms:Tbytesstream;
  57. st:TkbmMWLookupStorage;
  58. sl:TStringList;
  59. s:string;
  60. begin
  61. fs:=TFileStream.Create(edit2.Text,fmOpenReadWrite);
  62. ms:=TbytesStream.Create;
  63. kbmMWCrypt1.PassPhrase:='xalion123456';
  64. kbmMWCrypt1.decrypt(nil,fs,ms);
  65.  
  66. try
  67. st:=TkbmMWLookupStorage.Create(ms);
  68. try
  69. sl:=TStringList.Create;
  70. try
  71. st.GetIdentifiers(sl);
  72. for i:= to sl.Count- do
  73. begin
  74. s:=sl.Strings[i];
  75. fsfile:=TFileStream.Create(edit3.Text+s,fmCreate or fmOpenWrite);
  76. try
  77. st.Get(s,fsfile);
  78. finally
  79. fsfile.Free;
  80. end;
  81. end;
  82.  
  83. finally
  84. sl.Free;
  85. end;
  86. finally
  87. st.Free;
  88. end;
  89. finally
  90. fs.Free;
  91. end;
  92.  
  93. showmessage('解包成功!');
  94.  
  95. end;

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

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

kbmmw 中虚拟文件操作入门的更多相关文章

  1. 第32课 Qt中的文件操作

    1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操 ...

  2. 003-Tuple、Array、Map与文件操作入门实战

    003-Tuple.Array.Map与文件操作入门实战 Tuple 各个元素可以类型不同 注意索引的方式 下标从1开始 灵活 Array 注意for循环的until用法 数组的索引方式 上面的for ...

  3. 重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作

    原文:重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作 [源码下载 ...

  4. 背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Application Data 中的媒体

    [源码下载] 背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Ap ...

  5. 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理

    [源码下载] 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理 作者:webabcd 介绍背水一战 Windows 10 ...

  6. Java中的文件操作(一)RandomAccessFile

    今天,学到的是java中的文件操作. Java.IO.File Java中操作文件用到RandomAccessFile类,既可以读取文件内容,也可以向文件输出数据,但不同与普通输入/输出流的是Rand ...

  7. Win 32平台SDK中的文件操作

    读取文件: HANDLE hFile ; // 声明文件操作内核对象句柄 hFile = CreateFile(, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ...

  8. 关于文件的INode与Java中的文件操作接口

    本文由作者周梁伟授权网易云社区发布. 近日做的项目中涉及到多进程共同读写多个文件的问题,文件名和最后修改时间都是可能会被频繁修改的,因而识别文件的唯一性会产生相当的麻烦,于是专门再学习了一下文件系统对 ...

  9. ASP.NET中的文件操作(文件信息,新建,移动,复制,重命名,上传,遍历)(亲测详细)

    做了几天的文件操作,现在来总结一下,错误之处,还望指点!以文件为例,如果对文件夹操作,基本上将File换为Directory即可(例:FileInfo file = new FileInfo(Path ...

随机推荐

  1. 八:python 对象类型详解四:字典

    一:字典通识: 1,字典通过键而不是偏移量来读取: 2,字典是任意对象的无序集合: 3,字典可变长.异构.任意嵌套: 4,字典属于可变映射类型: 5,对象引用表(散列表): 二:实际应用中的字典: 1 ...

  2. Camera插件推荐,解锁电影大师级视角控制

    相机在游戏中的重要性是不言而喻的,尤其是一些MMORPG或FPS等类型的游戏,相机不仅需要跟随游戏主角进行移动,可能还要随时准备切换焦点,这就要求开发者将游戏相机管理得井井有条,能顺应游戏中可能瞬息发 ...

  3. Bugku——Flag在index里(http://120.24.86.145:8005/post/)

    Bugku——Flag在index里(http://120.24.86.145:8005/post/) 进入题目发现有一个file参数,查看源码,发现该参数可以包含php文件,并且题目提示,flag在 ...

  4. VTP

    VTP VLAN中继协议(Vlan Trunking Protocol),是CISCO专用协议.VTP负责在VTP域内同步VLAN信息,这样就不必在每个交换机上配置相同的VLAN信息.VTP还提供一种 ...

  5. Spring Boot 使用465端口发送邮件

    2017年10月27日 15:04:24 伊宇紫 阅读数:2710 标签: 465端口邮件springboot 更多 个人分类: Java   版权声明:本文为博主原创文章,未经博主允许不得转载. h ...

  6. webpack浅析---入口篇

    webpack有四个核心概念: 入口(entry) 输出(output) loader 插件(plugins) webpack-merge将环境.构建目标.运行时合并 入口: 入口起点是指webpac ...

  7. tomcat/eclipse提速[z]

    在使用Eclipse开发项目过程中,一度使Eclipse陷入瘫痪状态,Tomcat启动项目时也异常缓慢,增加了超时限制并没有用,有时候项目根本运行不起来,简直让人崩溃,可能我电脑内存小(4G),配置低 ...

  8. "//./root/CIMV2" because of error 0x80041003. Events cannot be delivered through this filter until the problem is corrected.

    windows系统日志错误信息: Event filter with query "SELECT * FROM __InstanceModificationEvent WITHIN 60 W ...

  9. webstorm 打包angular Module build failed: Error: No PostCSS Config found

    angular创建项目后,在webstorm中启动时,报出如题错误,奇怪的是我从命令行启动(ng server)是没有问题的,多方寻求无果,在网上看到过说要加一个配置文件,我不信.我觉得是我配置哪里有 ...

  10. 字典的增删改查 daty 5

    字典:python中非常重要的数据类型,在python中唯一一个映射的数据类型数据类型分类 按照数据可变与不可变: # 不可变数据类型: int str bool tuple # 可变数据类型: li ...