VB 如何以二进制方式合并和拆分文件

例如我有a.exe,b1.doc,b2.doc,b3.doc等至少2个文件,希望按顺序以二进制的方式合并文件,最后得到a.exe+b1.doc+b2.doc+b3.doc... 例如我有 a.exe,b1.doc,b2.doc,b3.doc等至少2个文件,希望按顺序以二进制的方式合并文件,最后得到a.exe+b1.doc+b2.doc+b3.doc,我采用的方法如下:
Dim Buff() as Byte
for i=1 to 3
Open App.path & "\b" & i & ".doc" For Binary Access Read As #11
FLen = LOF(11) ReDim Buff(1 To FLen) Get #11, , Buff Close #11 Open App.path & "\a.exe" For Binary Access Write As #22 PicFLen = LOF(22) Seek #22, PicFLen + 1 '设置写入点
Put #22, , Buff '合并数据
Put #22, , "b" & i & ".doc" '追加文件名数据
Put #22, , PicFLen + 1 '追加写入点数据,4个字节
Put #22, , FLen '追加合并文件长度,4个字节
Put #22, , Len("b" & i & ".doc" ) '追加合并文件名长度,4个字节
Close #22 next
文件合并完毕后,得看一个合并后的文件a.exe,现需要从a.exe中将其拆分还原为a.exe,b1.doc,b2.doc,b3.doc等四个文件,我的方法如下:
Open App.Path & "\a.exe" For Binary Access Read As #3 P = LOF(3)-11
Pos=p Do Seek #3, P Get #3, , P1 '读取写入点
P = P + 4 Seek #3, P Get #3, , P2 '读取文件长度
P = P + 4 Seek #3, P Get #3, , P3 '读取文件名长度
P = P1 + P2 '- 1 Seek #3, P FName = Space(P3) Get #3, , FName '获取文件名 Seek #3, P1 ReDim Buff(1 To P2) Get #3, , Buff NewFile = "c:\ " & FName Open NewFile For Binary Access Write As #4 If Err.Number Then Close #3: Exit Do Put #4, , Buff Close #4
'到此步为止,第一次循环之后,成功地将b3.doc从a.exe分割出来了,文件名b3.doc被成功还原,文件b3.doc的内容也成功分割还原出来了。接下来需要将b2.doc,b1.doc的文件名准确地分割出来,且将b2.doc,b1.doc的内容也要准确地分割出来,就出错了,也就是在第二次循环时,Get #3, , FName 代码读出来的b2.doc文件名是乱码,不再是准确的b2.doc了,请问接下来如何继续解析b2.doc,b1.doc的文件名和文件内容并独立保存为独立的文件呢?
pos=pos-11 ‘这里不知道如何写了
p=pos '这里不知道如何写了
loop
展开
 我来答
ljl88900
推荐于2016-11-27 · TA获得超过2661个赞
知道大有可为答主
回答量:2197
采纳率:100%
帮助的人:2637万
展开全部


Private Sub Command1_Click()'文件合并
    Dim Buff() As Byte, i As Integer, Flen As Long, PicFlen As Long
    Dim DocName() As Byte, DocLen As Long
    For i = 1 To 3
        Open App.Path & "\b" & i & ".doc" For Binary Access Read As #11
            Flen = LOF(11)
            ReDim Buff(1 To Flen)
            Get #11, , Buff
        Close #11
        DocName = StrConv("b" & i & ".doc", vbFromUnicode)
        DocLen = UBound(DocName) + 1
        Open App.Path & "\a.exe" For Binary Access Write As #22
            PicFlen = LOF(22)
            Seek #22, PicFlen + 1    '设置写入点
            Put #22, , Buff    '合并数据
            Put #22, , DocName    '追加文件名数据
            Put #22, , Flen    '追加合并文件长度,4个字节
            Put #22, , DocLen    '追加合并文件名长度,4个字节
        Close #22
    Next
    MsgBox "文件合并完毕!"
End Sub

Private Sub Command2_Click()'文件拆分
    Dim Buff() As Byte, i As Integer, Flen As Long, PicFlen As Long
    Dim DocName() As Byte, DocLen As Long, P As Long, Pos As Long, S As String
    Open App.Path & "\a.exe" For Binary Access Read As #22
        Flen = LOF(22)
        ReDim Buff(1 To 4)
        For i = 1 To 3
            Pos = Flen - 8
            Seek #22, Pos + 1    '设置写入点
            Get #22, , Flen
            Get #22, , DocLen
            ReDim Buff(1 To DocLen)
            Pos = Pos - DocLen
            Seek #22, Pos + 1
            Get #22, , Buff
            S = App.Path & "\" & StrConv(Buff, vbUnicode)
            If Dir(S) <> "" Then Kill S
            Open S For Binary Access Write As #11
                Pos = Pos - Flen
                Seek #22, Pos + 1
                ReDim Buff(1 To Flen)
                Get #22, , Buff
                Put #11, , Buff
            Close #11
            Flen = Pos
        Next
        Seek #22, 1
        ReDim Buff(1 To Flen)
        Get #22, , Buff
    Close #22
    Kill App.Path & "\a.exe"
    Open App.Path & "\a.exe" For Binary Access Write As #11
        Put #11, , Buff
    Close #11
    MsgBox "文件拆分完毕!"

End Sub
网海1书生
科技发烧友

2013-12-19 · 擅长软件设计、WEB应用开发、小程序
网海1书生
采纳数:12311 获赞数:26228

向TA提问 私信TA
展开全部
要注意的是,VB内部是采用Unicode编码的,在这种编码格式下,字符串中的任何一个字符(字母、数字、符号以及汉字和全角符号)都是占用两个字节的,比如你在VB的立即窗口做个测试:
?len("b2.doc")
这个结果是6,表示6个字符,这个没问题
?lenb("b2.doc")
这时候问题来了,显示结果是12!也就是说,这个文件名占用的字节是12个!

所以你在程序中用Len("b" & i & ".doc")来保存文件名长度是有问题的,它比文件名实际占用的字节数整整少了一半!
更多追问追答
追问
谢谢你的指点。那你能否把我的这段合并与拆分的程序修正一下,然后我再用你修正后的程序测试,看是否正确,再来揣摩学习如何合并和拆分。
追答
len改为lenb试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式