VBA解析复合文档05——读取数据流
时间:2022-07-22
本文章向大家介绍VBA解析复合文档05——读取数据流,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
根据前面解析得到的FAT数组、MiniFAT数组、目录信息,读取某个数据流就很简单了,只需要根据FAT数组或者MiniFAT数组构建的扇区链表,逐个扇区的去读取就可以:
'读取某个数据流
'dir_name 需要读取的文件名称,是复合文档中的文件名称
'RetBytes 返回解压后的数据Byte数组
'Return 返回出错信息
Function GetStream(dir_name As String, RetBytes() As Byte) As String
If cf.h.Exists(dir_name) Then
GetStream = GetStreamByDirIndex(VBA.CLng(cf.h.GetItem(dir_name)), RetBytes)
Else
GetStream = "复合文档:不存在的目录"
Exit Function
End If
End Function
'读取数据流
Private Function GetStreamByDirIndex(dirIndex As Long, RetBytes() As Byte) As String
'1仓storage 2流 5根
If cf.ArrDir(dirIndex).ObjectType <> 2 Then
GetStreamByDirIndex = "复合文档:不是数据流"
Exit Function
End If
If cf.ArrDir(dirIndex).StartingSectorID = Free_SID Then
GetStreamByDirIndex = "复合文档:流的大小为0"
Exit Function
End If
ReDim RetBytes(cf.ArrDir(dirIndex).StreamSize - 1) As Byte
If cf.ArrDir(dirIndex).StreamSize < cf.Header.MiniStreamSize Then
GetStreamByDirIndex = GetStreamMiniFAT(dirIndex, RetBytes)
Else
GetStreamByDirIndex = GetStreamFAT(dirIndex, RetBytes)
End If
End Function
'按照FAT读取数据
Private Function GetStreamFAT(dirIndex As Long, RetBytes() As Byte) As String
Dim b() As Byte
ReDim b(cf.lSectorSize - 1) As Byte
'找到读取开始的位置
Dim sid As Long
sid = cf.ArrDir(dirIndex).StartingSectorID
Dim i As Long
Dim p As Long
Do
'设置读取的位置
cf.r.SeekFile getOffsetBySID(sid), OriginF
cf.r.Read b
For i = 0 To cf.lSectorSize - 1
RetBytes(p) = b(i)
p = p + 1
If p = cf.ArrDir(dirIndex).StreamSize Then Exit Function
Next
'下一个扇区
sid = cf.FAT(sid)
Loop
End Function
'按照MiniFAT读取数据
Private Function GetStreamMiniFAT(dirIndex As Long, RetBytes() As Byte) As String
Dim b() As Byte
ReDim b(cf.lShortSectorSize - 1) As Byte
'找到读取开始的位置
Dim miniSID As Long
miniSID = cf.ArrDir(dirIndex).StartingSectorID
Dim i As Long
Dim p As Long
Do Until miniSID = End_Of_Chain_SID
'设置读取的位置
cf.r.SeekFile getOffsetByMiniFATSID(miniSID), OriginF
cf.r.Read b
For i = 0 To cf.lShortSectorSize - 1
RetBytes(p) = b(i)
p = p + 1
If p = cf.ArrDir(dirIndex).StreamSize Then Exit Do
Next
'下一个扇区
miniSID = cf.MiniFAT(miniSID)
Loop
End Function
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法