回 帖 发 新 帖 刷新版面

主题:[原创]彻底解决资源文件释放问题

资源文件释放的问题一直困扰着许多程序员,这几天的攻关成果希望能给大家带来福音。


    假设要放入资源文件中的文件已经通过我的程序分割成了若干个文件,且这些文件被按顺序导入了资源文件。
比如“童话.mp3”切割成了,“童话1.mp3”\“童话2.mp3”\“童话3.mp3”\“童话4.mp3”\“童话5.mp3”\“童话6.mp3”……“童话54.mp3”,然后将它们按顺序导入资源文件。
资源序号对应为101-154
释放资源文件的函数如下:
Function AddGroup(ByRef Mains() As Byte, ByRef Sources() As Byte)  '代码完成,by S.R.
Dim a As Long, b As Long, i As Long
a = UBound(Mains) '3
b = UBound(Sources) '5
If a = 0 Then
ReDim Preserve Mains(a + b)
Else
ReDim Preserve Mains(a + b + 1)
End If
For i = 0 To b
    If a = 0 Then
    Mains(a + i) = Sources(i)
    Else
    Mains(a + i + 1) = Sources(i)
    End If
Next i
End Function

Function OutputFile(ByVal cbegin As Long, ByVal cend As Long, ByVal outname As String)
Dim whole() As Byte
Dim temp() As Byte
Dim socode As Long
ReDim whole(0)
For socode = cbegin To cend
Erase temp
temp = LoadResData(socode, "CUSTOM")
Call AddGroup(whole, temp)
Erase temp
Next socode
Open outname For Binary As #1
Put #1, , whole
Close #1
Erase whole
ReDim whole(0)
Erase temp
socode = 0
End Function

对上面的函数进行调用可以将例子“童话.MP3”重新释放出来

调用方法:
Call OutputFile(101,154,"F:\童话.mp3")
即可从资源文件释放出音乐。

    我们大家知道,音乐文件和应用程序文件一样,是结构最严谨的文件。我测试了音乐文件和应用程序的:分解→分别按顺序添加到资源文件→从应用程序释放的整个过程。没有出现问题。也就是说,可以比较肯定我这个方法是彻底解决了网上传的“资源文件释放时会多出一两个字节”的问题。当然,也有可能是我的疏忽,我的程序可能还存在这样那样的问题,希望大家指出。

    下面送上的是我写的文件分割工具,可以精确到kb进行文件分割。绝无问题。但是,特大文件的分割,是不可以用我这个程序的。

【以上所述内容毫无保留且本人担保是原创,且担保是在本人电脑上正确运行了的】
【说明:所有内容均免费发布,版权归本人所有,免费提供学习】

回复列表 (共10个回复)

沙发

读出资源就直接写入文件不就行了吗?
为什么还要搞怎么复杂。

板凳

[quote]读出资源就直接写入文件不就行了吗?
为什么还要搞怎么复杂。[/quote]
因为资源文件有单文件64k的限制,如果我需要释放一个3m的文件,那怎么办?
你说该怎么办?没有这个类型代码应该就不行!

我试过,把一个3M的文件直接添加到资源文件,的确没有出错提示,但是从资源文件提取的数据仅仅有64k。你说呢?

3 楼

Option Explicit

Private Sub Form_Load()
    Me.Caption = App.Title
    OutputFile 101, "MP3", App.Path & "\test.mp3"
End Sub

Function OutputFile(vID As Variant, vType As Variant, ByVal outName As String) As Boolean
Dim tmpData() As Byte
Dim iFileNO As Integer
On Local Error GoTo Errs
    tmpData = LoadResData(vID, vType)
    'Debug.Print UBound(tmpData) - LBound(tmpData) + 1
    iFileNO = FreeFile
    Open outName For Binary Lock Write As #iFileNO
        Put #iFileNO, , tmpData
Errs:
    Close #iFileNO
    Erase tmpData
    'Debug.Print Err.Number, Err.Description
    OutputFile = (Err.Number <> 0)
End Function

'试试看吧,我这里就是一次性读出的。3.12MB,没能感受你的苦恼。

4 楼

[quote]Option Explicit

Private Sub Form_Load()
    Me.Caption = App.Title
    OutputFile 101, "MP3", App.Path & "\test.mp3"
End Sub

Function OutputFile(vID As Variant, vType As Variant, ByVal outName As String) As Boolean
Dim tmpData() As Byte
Dim iFileNO As Integer
On Local Error GoTo Errs
    tmpData = LoadResData(vID, vType)
    'Debug.Print UBound(tmpData) - LBound(tmpData) + 1
    iFileNO = FreeFile
    Open outName For Binary Lock Write As #iFileNO
        Put #iFileNO, , tmpData
Errs:
    Close #iFileNO
    Erase tmpData
    'Debug.Print Err.Number, Err.Description
    OutputFile = (Err.Number <> 0)
End Function

'试试看吧,我这里就是一次性读出的。3.12MB,没能感受你的苦恼。[/quote]
LoadResData 从资源文件装载的数据可以达到 64K。
上面那句是从msdn中摘的。我现在就试试你说的方法。


5 楼

[quote]Option Explicit

Private Sub Form_Load()
    Me.Caption = App.Title
    OutputFile 101, "MP3", App.Path & "\test.mp3"
End Sub

Function OutputFile(vID As Variant, vType As Variant, ByVal outName As String) As Boolean
Dim tmpData() As Byte
Dim iFileNO As Integer
On Local Error GoTo Errs
    tmpData = LoadResData(vID, vType)
    'Debug.Print UBound(tmpData) - LBound(tmpData) + 1
    iFileNO = FreeFile
    Open outName For Binary Lock Write As #iFileNO
        Put #iFileNO, , tmpData
Errs:
    Close #iFileNO
    Erase tmpData
    'Debug.Print Err.Number, Err.Description
    OutputFile = (Err.Number <> 0)
End Function

'试试看吧,我这里就是一次性读出的。3.12MB,没能感受你的苦恼。[/quote]
我试了的,发现不行,连文件都没有生成。可能是我们的版本不一样。我是VB6.0
你可以把你做的工程文件发给我:wedown@163.com
我看看是不是正确无误。

6 楼

嗯,我这是vb6迷你版。

7 楼

用一个2.96M(3,113,637 字节)的mp3测试,同样没发现有问题
同样也没发现有所谓的字节对齐补足的问题。。

8 楼

[quote]用一个2.96M(3,113,637 字节)的mp3测试,同样没发现有问题
同样也没发现有所谓的字节对齐补足的问题。。[/quote]
发一个你写的工程给我参考下,谢谢!
wedown@163.com

9 楼

Dim bytRes() As Byte
Dim fNo As Integer

bytRes = LoadResData(102, "CUSTOM")
Command3.Caption = UBound(bytRes)

fNo = FreeFile()
Open "e:\testRes3.mp3" For Binary As fNo
    Put #fNo, , bytRes
Close

10 楼

进过测试,
天天学习 的方法我测试了,是对的。谢谢!我承认我这个帖子的说法有错误。但是,我给出的方法也是正确的,但的确多此一举。
我奇怪的是,我记得以前好像不能这样的,可能是我记错了吧。

我来回复

您尚未登录,请登录后再回复。点此登录或注册