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 展开
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 展开
2个回答
展开全部
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
展开全部
要注意的是,VB内部是采用Unicode编码的,在这种编码格式下,字符串中的任何一个字符(字母、数字、符号以及汉字和全角符号)都是占用两个字节的,比如你在VB的立即窗口做个测试:
?len("b2.doc")
这个结果是6,表示6个字符,这个没问题
?lenb("b2.doc")
这时候问题来了,显示结果是12!也就是说,这个文件名占用的字节是12个!
所以你在程序中用Len("b" & i & ".doc")来保存文件名长度是有问题的,它比文件名实际占用的字节数整整少了一半!
?len("b2.doc")
这个结果是6,表示6个字符,这个没问题
?lenb("b2.doc")
这时候问题来了,显示结果是12!也就是说,这个文件名占用的字节是12个!
所以你在程序中用Len("b" & i & ".doc")来保存文件名长度是有问题的,它比文件名实际占用的字节数整整少了一半!
更多追问追答
追问
谢谢你的指点。那你能否把我的这段合并与拆分的程序修正一下,然后我再用你修正后的程序测试,看是否正确,再来揣摩学习如何合并和拆分。
追答
len改为lenb试试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询