|
|
前些天,我在一个外国的网站看到了一篇教你打包文件的教程,于是就用金山词霸(E文有点不行)看了一下,根据提示建立了一个测试工程,代码如下:
Option Explicit
Public Type FileHeader
intNumFiles As Integer
lngFileSize As Long
End Type
Public Type InfoHeader
strFileName As String * 9
lngFileStart As Long
lngFileSize As Long
End Type
Private Sub Command1_Click()
Dim intFileNum1 As Integer, intFileNum2 As Integer, intFileNum3 As Integer '//文件号
Dim intBinFileNum As Integer '//文件号
Dim bytData1() As Byte, bytData2() As Byte, bytData3() As Byte
Dim lngFileStart As Long
Dim BinaryFileHeader As FileHeader
Dim BinaryInfoHeader() As InfoHeader
On Local Error GoTo ErrOut
'//以二进制方式打开三个不同类型文件
intFileNum1 = FreeFile
Open App.Path & "\Data\Image\test.bmp" For Binary Access Read Lock Write As intFileNum1
intFileNum2 = FreeFile
Open App.Path & "\Data\Image\test.txt" For Binary Access Read Lock Write As intFileNum2
intFileNum3 = FreeFile
Open App.Path & "\Data\Image\test.wav" For Binary Access Read Lock Write As intFileNum3
'//重定义bytData1,bytData2,bytData3
ReDim bytData1(LOF(intFileNum1) - 1)
ReDim bytData2(LOF(intFileNum2) - 1)
ReDim bytData3(LOF(intFileNum3) - 1)
'//读取打开的文件到bytData1,bytData2,bytData3数组里
Get intFileNum1, 1, bytData1
Get intFileNum2, 1, bytData2
Get intFileNum3, 1, bytData3
'//关闭并删除文件
Close intFileNum1
Close intFileNum2
Close intFileNum3
Kill App.Path & "\Data\Image\test.bmp"
Kill App.Path & "\Data\Image\test.txt"
Kill App.Path & "\Data\Image\test.wav"
'//给BinaryFileHeader的成员赋值
'共有3个文件要合并
BinaryFileHeader.intNumFiles = 3
'合并后的文件大小为:3个文件的大小+文件头的大小+信息头的大小
BinaryFileHeader.lngFileSize = (UBound(bytData1) + 1) + (UBound(bytData2) + 1) + (UBound(bytData3) + 1) + (6) + (BinaryFileHeader.intNumFiles * 17)
'//重定义BinaryInfoHeader
ReDim BinaryInfoHeader(1 To 3)
'//为BinaryInfoHeader结构赋值
BinaryInfoHeader(1).strFileName = "test.bmp"
BinaryInfoHeader(2).strFileName = "test.txt"
BinaryInfoHeader(3).strFileName = "test.wav"
BinaryInfoHeader(1).lngFileSize = UBound(bytData1) + 1
BinaryInfoHeader(2).lngFileSize = UBound(bytData2) + 1
BinaryInfoHeader(3).lngFileSize = UBound(bytData3) + 1
lngFileStart = 6 + 17 * BinaryFileHeader.intNumFiles + 1
BinaryInfoHeader(1).lngFileStart = lngFileStart
lngFileStart = lngFileStart + BinaryInfoHeader(1).lngFileSize
BinaryInfoHeader(2).lngFileStart = lngFileStart
lngFileStart = lngFileStart + BinaryInfoHeader(2).lngFileSize
BinaryInfoHeader(3).lngFileStart = lngFileStart
'//取得一个未被使用的文件号
intBinFileNum = FreeFile
'//建立一个文件名为bin.dat的文件
Open App.Path & "\bin.dat" For Binary Access Write Lock Read Write As intBinFileNum
'//写入文件头数据,信息头数据,三个要合并文件的数据
Put intBinFileNum, 1, BinaryFileHeader
Put intBinFileNum, , BinaryInfoHeader
Put intBinFileNum, , bytData1
Put intBinFileNum, , bytData2
Put intBinFileNum, , bytData3
'//关闭文件
Close intBinFileNum
Exit Sub
ErrOut:
MsgBox "不能建立二进制文件!", vbOKOnly, "Error"
End Sub
它的思路是:首先以二进制方式打开要合并的文件("test.bmp","test.txt","test.wav),以字节为单位将文件的内容读到bytData1(),bytData2(),bytData3()数组中。然后填写FileHeader结构,它有两个成员: intNumFiles 保存的是要合并文件的个数;lngFileSize保存的合并后文件的大小。接着再填写InfoHeader结构,它的作用是保存每一个要合并的文件的信息,所以定义了一个3元素的数组,它有三个成员:strFileName保存的是合并文件的文件名;lngFileSize保存的是合并文件的大小;lngFileStart保存的是它在合并文件中的起始位置。最后,将FileHeader,
InfoHeader中的数据与要合并的三个文件一起写入文件bin.dat中。
按理说我应该高兴才对----终于可以在自己制作的游戏里用合并后的文件了,这样玩家就不可以在未玩游戏之前看图片,听音乐...了,但是~问题又出来了,我该怎么用合并后的文件调入图片及声音那?虽然我知道将上述代码倒过来,再加上一些修改就可以将bin.dat文件还原成原来的3个文件了,但是----不会要我在运行游戏中把它还原,再用吧,这样合并文件也没有什么用哦,还自找麻烦。我的问题是如何读取合并后的bin.dat文件做你想做的事!例如想在一个图片框中从bin.dat文件中加载一个test.bmp文件,该怎做?想从bin.dat文件中加载一个test.wav文件并播放,又该怎做...不会是用API函数吧。又或许将wav文件,txt文件和位图文件合成一个二进制文件太乱,应将所有的wav文件合成一个文件,所有的位图文件也合成一个文件这样调用起来是否简单些,可最大的问题是不会用啊,急煞我也。
[em4] [em4]
各位高手们,大侠们,行行好救救我把----头想破了也无结果(知识太贫乏了,毕竟是新手)
谁来救救我吧! |
|