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= 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:= to sl.Count- 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= 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:=;
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:= to sl.Count- 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;

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

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

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. HDFS 总结

    HDFS是一个分布式文件存储系统 Client  提交读写请求(拆分blocksize) NameNode 全局把控(知道blocksize的地址) dataNode 存储数据(将数据存储进去,且以P ...

  2. phpStudy安装教程

    1.在phpStudy官网下载安装包(http://phpstudy.php.cn/)2.解压安装后,若提示没有“VC9.VC11.VC14运行库,注意是X86 32位”,则在phpStudy下载对应 ...

  3. MySQL的四种不同查询的分析

    1.前置条件: 本次是基于小数据量,且数据块在一个页中的最理想情况进行分析,可能无具体的实际意义,但是可以借鉴到各种复杂条件下,因为原理是相同的,知小见大,见微知著! 打开语句分析并确认是否已经打开 ...

  4. 破解myeclipse 2014

    用网上的教程的确可以,但是他似乎写的有点少.....试了很多次,说说他少的: http://jingyan.baidu.com/article/fdbd42771039bfb89e3f4838.htm ...

  5. Python: re.sub()第二个参数

    起源: 问题源于解析kissanime.io这个网站.为反扒抑或是防止ddos攻击,此视频页面,初进去会有个5秒延迟并提交一表单验证.而其表单验证,为下面一段html代码: <form id=& ...

  6. 大数据分析界的“神兽”Apache Kylin有多牛?【转】

    本文作者:李栋,来自Kyligence公司,也是Apache Kylin Committer & PMC member,在加入Kyligence之前曾就职于eBay.微软. 1.Apache ...

  7. SVO+PL-SVO+PL-StVO

    PL-SVO是基于点.线特征的半直接法单目视觉里程计,我们先来介绍一下基于点特征的SVO,因为是在这个基础上提出的. [1]References:      SVO: Fast Semi-Direct ...

  8. ecplise中创建jsp页面时默认的编码格式为ISO-8859-1,这里我们将其编码格式设置为utf-8

    我们在创建jsp页面时,默认的编码格式为ISO-8859-1,我们如果想要将其改为utf-8还要自己手动去更改. 因此可以设置Jsp默认的编码为utf-8,具体步骤如下: 启动Eclipse,点击菜单 ...

  9. js中被调用的函数获取调用者对象

    通过event.srcElement即可.一直用了很久的传参,终于解决了.

  10. 初次搭建spring-boot 整合ssm(有许多小坑)

    首先,我是采用官网下载,版本最好选择1.5.16的(这是重点) 下载完毕后,用idea打开解压后的项目. 1.整合spring-mvc 在pom.xml中加入web依赖 <dependency& ...