@ PMV
FlushFileBuffers() gibt ab 4096 Byte immer "2" zurück. Egal was
passiert^^ ... Also bei WriteStringN() 4094 Byte wegen der Zeile-Ende.
Hm, ob der Befehl deswegen undokumentiert ist, oder bedeutet die "2",
das der FileBuffer überschritten war?
Wenn du 4096 Bytes in die Datei schreibst, gilt Folgendes:
1. 4096 ist die Größe des Puffers (Fehlwert)
2. Wird per WriteStringN geschrieben, so werden, wegen CRLF, 4098 Bytes auf die Platte geschrieben.
3. Die ersten 4096 Bytes werden ohne Zutun des Programms rausgeschrieben, weil der Puffer voll ist.
4. Der Puffer enthält danach nur noch CRLF, also 2 Bytes.
5. Das anschließende FlushFileBuffers schreibt den Puffer, also 2 Bytes raus und meldet daher als Rückgabewert 2
Das klappt auch. Ich habe es mit folgendem Code ausprobiert.
Code: Alles auswählen
OpenConsole()
AusgabeDatei$ = "xxx.txt"
If CreateFile(1, AusgabeDatei$)
FileBuffersSize(1, 4096)
AusgabeSatz$ = ""
For II = 1 To 409
AusgabeSatz$ = AusgabeSatz$ + "1234567890"
Next
AusgabeSatz$ = AusgabeSatz$ + "123456"
RC = WriteStringN(1, AusgabeSatz$)
RCF = FlushFileBuffers(1)
PrintN("RC: " + Str(RC) + " / RCF: " + Str(RCF))
CloseFile(1)
Else
PrintN("Fehler!")
EndIf
PrintN("Done!")
End
Daher musst du den Puffer so groß wählen, dass der größte zu
schreibende Satz reinpasst. Ansonsten musst du die Bytes
mitzählen, damit du am Ende weißt, was FlushFileBuffers liefern
muss.
Was du aber festgestellt hast, ist IMHO ein Bug in PB. Wenn du
mit einem WriteStringN einen längeren String als die Puffergröße
ausgibst, dann ist das Ergebnis in der Datei zwar u.U. OK, aber
der Rückgabewert ist es nicht. Ich vermute, es kommt zu einem
Pufferüberlauf. Der String wird trotzdem korrekt ausgegeben
und um das CRLF scheint sich PB erst danach zu kümmern.
Dafür spricht auch ein anderer Test. Gibst du zwei Strings aus,
deren gemeinsame Länge die Puffergröße übertrifft, so erkennt
man nach dem FlushFileBuffers, dass dieser den kompletten
zweiten String auf die Platte bringt. Das zeigt, dass PB vor jedem
Write prüft, ob der Puffer noch ausreicht und wenn nicht, wird er
vorher geleert. PB scheint hier also nicht auf Byteebene zu
arbeiten.
Das zuvor Beschriebene macht das Schreiben in die Datei mit dem
Zählen der Bytes nicht einfacher.
Also:
Puffer groß genug wählen und nach jedem Satz ein FlushFileBuffers.
Um Geschwindigkeit zu bringen könnte man ein n-faches eines
maximalen Satzes als Puffer einstellen und nur die Sätze zählen,
aber nicht die Bytes und dann alle n Sätze den FlushFileBuffers
machen.
Wenn man dann ganz auf Nummer Sicher gehen will, dann berechnet
man vor dem WriteStringN die Länge des Strings und gibt, sofern die
Puffergröße überschritten wird, den String in passenden Teilen aus.
Den Aufwand muss man eigentlich auch noch treiben, aber es genügt
wohl, wenn man es nur macht, wenn man bzgl. der Satzlänge nicht
sicher sein kann oder flexibel sein muss.
Ach ja, wenn der zu schreibende String zu groß ist für
das Medium, wird bei FlushFileBuffers() überhaupt nichts in die Datei
geschrieben. Ist das nun gut oder schlecht?
Das ist relativ gleichgültig. Die Hauptsache ist, das Programm
bekommt das mit. Wenn das Schreiben nicht klappt, dann
klappt es halt nicht. Ob das fehlerhafte Ergebnis dann so oder
so aussieht, ist doch egal.