Чтение и запись двоичного файла в VBscript - PullRequest
12 голосов
/ 19 мая 2011

Я использовал ранее ADODB.Stream для чтения и записи двоичного файла, вот ссылка для этого

Как объединить двоичный файл с использованием ADODB.stream в VBscript

работает нормально, единственная проблема - ADODB.stream отключен на сервере Windows 2003,

Есть ли другой способ прочитать 3 файла в двоичном режиме и объединить их или сохранить в одном файле в VBscript

спасибо Jp

Ответы [ 5 ]

6 голосов
/ 22 мая 2011

У меня была похожая проблема год назад.Мы знаем, что объекты TextStream предназначены для текстовых данных ANSI или Unicode, а не двоичных данных;их метод .readAll () создает поврежденный вывод, если поток является двоичным.Но есть обходной путь.Чтение символов один за другим в массив работает нормально.Это должно позволить вам читать двоичные данные в строки VB и записывать их обратно на диск.При дальнейшей манипуляции с такими двоичными строками не забывайте, что некоторые операции могут привести к разрыву строк, поскольку они предназначены только для текста.Я, например, всегда преобразовываю двоичные строки в целочисленные массивы, прежде чем работать с ними.

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</p>

<p>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</p>

<p>Function makeArray(n) ' Small utility function
Dim s
s = Space(n)
makeArray = Split(s," ")
End Function
5 голосов
/ 09 декабря 2014

Основываясь на ответах Luc125 и Alberto, здесь представлены две переработанные и упрощенные функции:

Функция чтения

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

Функция записи

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
4 голосов
/ 20 мая 2011

Объект потока ADODB - единственный собственный метод чтения двоичных потоков в VBScript. Если ADODB отключен, вам потребуется установить какой-либо другой сторонний компонент для обеспечения той же функциональности.

2 голосов
/ 11 ноября 2014

Можно прочитать все байты вместе:

Set FS = CreateObject("Scripting.FileSystemObject")
Set fil = FS.GetFile(filename)
fpga = fil.OpenAsTextStream().Read(file.Size)
0 голосов
/ 13 марта 2019

Объект потока ADODB - единственный собственный метод чтения двоичных потоков в VBScript

Const TypeBinary = 1
Const ForReading = 1, ForWriting = 2, ForAppending = 8

Function readBytes(file)

     Dim inStream: Set inStream = WScript.CreateObject("ADODB.Stream") ' ADODB stream object used

     inStream.Open ' open with no arguments makes the stream an empty container 
     inStream.type= TypeBinary
     inStream.LoadFromFile(file)
     readBytes = inStream.Read()

End Function

Sub writeBytes(file, bytes)

    Dim binaryStream: Set binaryStream = CreateObject("ADODB.Stream")

    binaryStream.Type = TypeBinary
    binaryStream.Open 'Open the stream and write binary data
    binaryStream.Write bytes
    binaryStream.SaveToFile file, ForWriting 'Save binary data to disk

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...