VBS: TextStreamObject.ReadAll funzt nicht

Hallo,

ich habe ein Problem mit der ReadAll-Funktion des TextStream-Objekts.

Eigentlich möchte ich einfach nur eine beliebige Datei öffnen und in eine Variable einlesen. In VBS funktioniert das offenbar nur über dieses TextStream-Objekt, was ja auch okay ist.

Das Problem: Wenn diese ReadAll-Funktion in der einzulesenden Datei auf eine NULL stößt, also das ASCII-Zeichen mit dem Code 0 (vbNullString), dann fängt das Teil an zu spinnen. Fortan werden nämlich nur noch NULLen eingelesen. Das beste ist aber, dass sich die Funktion irgendwann wieder erholt und von da an den normalen Inhalt weiter einliest.

Am Ende habe ich also in der Variable den Inhalt der Datei, allerdings mitten drin einen Bereich von NULLen, der bei der ersten NULL beginnt und unterschiedlich lang sein kann.

Lese ich die Datei hingegen mit der Read-Funktion Zeichen für Zeichen ein, geht es problemlos. Read(n) mit n>1 habe ich nicht probiert.

Ich dachte, dass ich das gestern gelöst hätte, indem ich auf TristateFalse umgestiegen bin als Parameter, aber entweder habe ich mich da getäuscht, oder heute ist es schon wieder vorbei.

Das folgende Skript demonstriert das Problem ganz gut. Hat jemand eine Idee, woran das liegen kann bzw. wie man es besser machen kann? Das Schreiben mit Write funktioniert übrigens offenbar einwandfrei. Dabei gibt es dieses Problem nicht.

Danke,
Kristian

PS: Ich lasse das Formatieren mit PRE weg, damit das Copy/Paste funktioniert.

Option Explicit

'-------------------------------------------------------------------------------
’ Kristian Zarse für WerWeissWas-Frage am 11.Oktober 2005
'-------------------------------------------------------------------------------

Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const TristateFalse = 0

'-------------------------------------------------------------------------------

Call ReadFile

'-------------------------------------------------------------------------------

Sub ReadFile()
Dim arrParams
Dim i
Dim fso
Dim f
Dim ts
Dim strFileName
Dim strFileContent1
Dim strFileContent2
Dim s

    Set arrParams = WScript.Arguments
    If arrParams.Count

Hallo
Ich habe das zwar noch nie benötigt, aber wenn das Programm den Asci 0 String liest, könnte es dann sein, dass das Programm den String „Null“ einliest?
Somit müsste man das ganze Filtern mit der If Bedingung If Not IsNull(String) then weiter einlesen, else Zeichen/Zeilen überspringen.

Gruss Sebastian

Nein, das geht nicht.

Hallo
Ich habe das zwar noch nie benötigt, aber wenn das Programm
den Asci 0 String liest, könnte es dann sein, dass das
Programm den String „Null“ einliest?

Das wäre vielleicht noch nichtmal schlimm, wenn es das nur bei den Nillen tun würde.

Somit müsste man das ganze Filtern mit der If Bedingung If Not
IsNull(String) then weiter einlesen, else Zeichen/Zeilen
überspringen.

Genau das geht nicht, weil ich die ReadAll-Funktion ja nicht beeinflussen kann. Die ist ja nicht von mir, sondern steckt sozusagen im VBS-Interpreter.
Außerdem - wenn ich die Datei Zeichenweise mit Read einlese, klappt es ja. Bei etwas größeren Dateien dauert das aber etliche Minuten.

Kristian

Anderes Einlesen
Und wenn Du das ganze Zeilenweise einliest?

Und wenn Du das ganze Zeilenweise einliest?

Hatte ich auch schon überlegt, aber noch nicht probiert. Ich erwarte aber, dass es nicht funktioniert, weil dabei die Zeilenende-Zeichen verloren gehen. Die müsste ich dann immer wieder manuell an die Zeilen anfügen. Und genau da steckt das Problem: Wenn VBS sowohl vbCrLf als auch vbCr und vbLf als EOL akzeptiert, weiss ich natürlich nicht, was ich ranhängen soll. Und damit kann ich das File nicht mehr komplett zusammenbauen.

Danke aber für den Tipp!

Ich werde das mal mit VB testen am Wochenende. Damit sollte es gehen.

Kristian

Anders gelöst …

Und wenn Du das ganze Zeilenweise einliest?

Nö, nicht zeilenweise, aber doch mit Read(n). Ich bin ein Blödmann! Diese Lösung hatte ich nämlich eigentlich schon in meiner Frage beschrieben. Allerdings hatte ich in dem Augenblick nicht daran gedacht, dass man ja auch Read(f.Size) machen kann, was ja praktisch das gleiche ist wie ReadAll und was auch nahezu gleich schnell ist.

Naja, so funktioniert es jedenfalls.

Hintergrund ist übrigens ein kleines Tool, das mir aus beliebigen Dateien ein Fake-GIF machen soll, also eine Datei, die o aussieht, als wäre sie eine normale GIF-Grafik. Grund für diesen Blödsinn ist, dass die Mail-Firewalls immer penetranter werden und inzwischen sogar in passwort-geschützte ZIP-Files reingucken, so dass man angeblich riskante Files gar nicht mehr per Mail verschickt bekommt. Das müssen wir hier aber fast täglich machen. Die Firewall weiss nur leider nicht, dass es eigentlich total harmlose Dateien sind und schmeisst sie immer raus.
Mit dem Tool konvertiert, sollten die Files dann aber ungeschoren durchgehen. Das hoffe ich jedenfalls :wink:

Viele Grüße,
Kristian