2011-05-19 37 views

Respuesta

3

El objeto de flujo ADODB es el único método nativo de VBScript para leer flujos binarios. Si ADODB está desactivado, deberá instalar algún otro componente de terceros para proporcionar la misma funcionalidad.

6

Tuve un problema similar hace un año. Sabemos que los objetos TextStream están destinados a datos de texto ANSI o Unicode, no a datos binarios; su método .readAll() produce un resultado dañado si la transmisión es binaria. Pero hay una solución. Leer los caracteres uno por uno en una matriz funciona bien. Esto debería permitirle leer datos binarios en cadenas VB y escribirlos en el disco. Cuando manipule más tales cadenas binarias, no olvide que ciertas operaciones pueden resultar en cadenas rotas porque están pensadas solo para texto. Yo siempre convierto cadenas binarias en matrices enteras antes de trabajar con ellas.

Function readBinary(path) 
Dim a 
Dim fso 
Dim file 
Dim i 
Dim ts 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set file = fso.getFile(path) 
If isNull(file) Then 
    MsgBox("File not found: " & path) 
    Exit Function 
End If 
Set ts = file.OpenAsTextStream() 
a = makeArray(file.size) 
i = 0 
' Do not replace the following block by readBinary = by ts.readAll(), it would result in broken output, because that method is not intended for binary data 
While Not ts.atEndOfStream 
    a(i) = ts.read(1) 
i = i + 1 
Wend 
ts.close 
readBinary = Join(a,"") 
End Function

Sub writeBinary(bstr, path) Dim fso Dim ts Set fso = CreateObject("Scripting.FileSystemObject") On Error Resume Next Set ts = fso.createTextFile(path) If Err.number <> 0 Then MsgBox(Err.message) Exit Sub End If On Error GoTo 0 ts.Write(bstr) ts.Close End Sub

Function makeArray(n) ' Small utility function Dim s s = Space(n) makeArray = Split(s," ") End Function

3

Es posible leer todos los bytes juntos:

Set FS = CreateObject("Scripting.FileSystemObject") 
Set fil = FS.GetFile(filename) 
fpga = fil.OpenAsTextStream().Read(file.Size) 
5

Basado en Luc125 y Alberto respuestas aquí son los 2 reelaborado y simplificado funciones:

la función de lectura

Function readBinary(strPath) 

    Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject") 
    Dim oFile: Set oFile = oFSO.GetFile(strPath) 

    If IsNull(oFile) Then MsgBox("File not found: " & strPath) : Exit Function 

    With oFile.OpenAsTextStream() 
     readBinary = .Read(oFile.Size) 
     .Close 
    End With 

End Function 

La función de escritura

Function writeBinary(strBinary, strPath) 

    Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject") 

    ' below lines pupose: checks that write access is possible! 
    Dim oTxtStream 

    On Error Resume Next 
    Set oTxtStream = oFSO.createTextFile(strPath) 

    If Err.number <> 0 Then MsgBox(Err.message) : Exit Function 
    On Error GoTo 0 

    Set oTxtStream = Nothing 
    ' end check of write access 

    With oFSO.createTextFile(strPath) 
     .Write(strBinary) 
     .Close 
    End With 

End Function 
+0

¿Necesita esta línea? 'Dim oTxtStream: establece oTxtStream = oFSO.createTextFile (strPath)' –

+1

esa línea se supone que debe verificar el acceso de escritura de los archivos. Si lo elimina, en algunos casos la secuencia de comandos puede bloquearse. – n3rd4i

Cuestiones relacionadas