将字节数组写入文件的问题

时间:2012-09-19 16:32:07

标签: vba excel-vba excel

在Windows下,安装Evernote时,还会安装api,可以通过vba访问(例如)。

每个笔记都可以显示其“资源”(附加文件和图像),实际资源可以作为字节数组检索。

我无法将字节数组写入实际文件。

变量声明:

Dim fileByte() As Byte
Dim nt As enapiLib.Note

获取数据:

fileByte = nt.Resources.Item(i).Data

将字节数组写入文件:

Function WriteByteArray(vData As Variant, sFileName As String, Optional bAppendToFile As Boolean = False) As Boolean
Dim iFileNum As Integer, lWritePos As Long

Debug.Print " --> Entering WriteByteArray function with " & sFileName & " file to write."
On Error GoTo ErrFailed
If bAppendToFile = False Then
    If Len(Dir$(sFileName)) > 0 And Len(sFileName) > 0 Then
        'Delete the existing file
        VBA.Kill sFileName
    End If
End If

iFileNum = FreeFile
Debug.Print "iFileNum = " & iFileNum
'Open sFileName For Binary Access Write As #iFileNum
Open sFileName For Binary Lock Read Write As #iFileNum

If bAppendToFile = False Then
    'Write to first byte
    lWritePos = 1
Else
    'Write to last byte + 1
    lWritePos = LOF(iFileNum) + 1
End If

Put #iFileNum, lWritePos, vData
Close #iFileNum

WriteByteArray = True
Exit Function

ErrFailed:
Debug.Print "################################"
Debug.Print "Error handling of WriteByteArray"
Debug.Print "################################"
FileWriteBinary = False
Close iFileNum
Debug.Print Err.Description & "(" & Err.Number & ")"
End Function

我尝试使用exe文件

通过debug.printing每个字节值,我知道我的字节数组以每个其他exe文件的4D 5A开头

Resource (1) : 
ClickToSetup.0.9.8.1416.exe
application/x-msdownload
Le fichier C:\Dropbox\TestEvernote\ClickToSetup.0.9.8.1416.exe doit être créé.
Lbound(fileByte) = 0
Ubound(fileByte) = 5551919
i = 0
filebyte(i) = 4D
i = 1
filebyte(i) = 5A

通过读回创建到字节数组的exe文件,我知道新创建的数组以字节4D 5A开头,希望

但是硬盘驱动器上的exe文件是_corrupted_,并且_ notes start_并且没有正确的bytes_:

以下是硬盘上存储文件的第一个二进制值:(来自VBinDiff工具)(我无法发布图片,我是新手......):VBinDiff output of exe

为什么在实际数据前面有这12个字节?

2 个答案:

答案 0 :(得分:12)

我遇到了同样的问题 - 在写入的每个文件的顶部抛出了一些12字节的标题。事实证明,PUT命令并不完全知道如何处理Variant类型的数据。我不确定确切的原因,但我的工作是简单地更换PUT线:

    Put #iFileNum, lWritePos, vData

用这个:

    Dim buffer() As Byte
    buffer = vData
    Put #iFileNum, lWritePos, buffer

问题解决了。

答案 1 :(得分:1)

VB6 中,保存的内容前面有一个神秘的额外12个字节。为什么?因为您保存了Variant结构以及Variant的内容。

您需要" 复制" Variant内容为Byte数组,例如:

ReDim arrByte(0 To UBound(varBuffer) - LBound(varBuffer))

For i = 0 To UBound(varBuffer) - LBound(varBuffer)
  arrByte = varBuffer(i + LBound(varBuffer))
Next i