Seite 1 von 1

Aufpassen bei File-Library!

Verfasst: 09.04.2006 11:06
von Hyper
Hallo Gefährten,

--------------
EDIT: Kein Bug, sondern geänderte Funktionalität, siehe unten, Gruß Hyper.
--------------

ich habe gerade einen sehr gefährlichen Bug in PB4.00 entdeckt. Hier sind 2 Programme zum Nachstellen:

Code: Alles auswählen

; Programm "Schreiben"
; --> laufen lassen und im Debugger stehen lassen

CreateFile(1, "c:\test.dat")
WriteLong(1,545)
For i = 1 To 1000
  WriteStringN(1,"TEXT::::::"+Str(i))
Next

Debug "File-Laenge= " + Str(Lof(1))

CallDebugger

Code: Alles auswählen

; Programm "Lesen"
; --> 1) Test mit Prg. "Schreiben" - im Debugger aktiv        ==> FEHLER!
; --> 2) Prg. "Schreiben" beenden, Programm "Lesen" Neustart  ==> ok

CopyFile("c:\test.dat", "c:\copy.dat")
ReadFile(1,"c:\copy.dat")

Debug ReadLong  (1)
For i = 1 To 1000
  Debug ReadString(1)
Next

Debug "File-Laenge= " + Str(Lof(1))

CallDebugger
Fazit:
- Wenn Programm "Schreiben" noch aktiv ist, kann Programm "Lesen" nur bis Satz 826 die Daten lesen!
- Wird Programm "Schreiben" beendet, funktioniert das Lesen.

Meines Erachtens ein schwerer Bug.

Verfasst: 09.04.2006 11:45
von ts-soft
Es kann nur auf eine Datei schreibend zugegriffen werden!
Der Bug ist ein anderer. Dein Test!!! Datei muß geschlossen werden,
ansonsten wird der Buffer nicht flashed!

Wer seine Testdaten in das Root vom Systemdrive schreibt :freak:

Verfasst: 09.04.2006 12:09
von Hyper
Aha, mein Test ist der Bug. So einfach ist das.
Wie erklärst Du Dir dann, dass das Problem unter PB3.94 nicht auftritt?

Verfasst: 09.04.2006 12:17
von ts-soft
Weil die Daten dort nicht gebuffered wurden, sondern sofort geschrieben.
Deswegen war es ja auch so lahmarschig.
Das Buffern ist aber Standard. Macht Windows auch.

Eine zum schreiben geöffnete Datei ist gesperrt. Nur zum lesen kann eine
Datei auch mehrmals geöffnet werden.

Vielleicht solltest Du mal die Hilfe lesen!!!
Dateioperationen sind zu Prüfen,
siehe auch gleich mal bei If nach :mrgreen:

Verfasst: 09.04.2006 12:21
von Kiffi
Hyper hat geschrieben:Aha, mein Test ist der Bug. So einfach ist das.
Wie erklärst Du Dir dann, dass das Problem unter PB3.94 nicht auftritt?
unter PB4 sind die File-Funktionen optimiert worden. Wenn man
beispielsweise mit WriteString in eine Datei schreibt, dann wird nicht String
für String direkt auf den Datenträger geschrieben, sondern ein interner
Speicher (Buffer) gefüllt, der ab einem bestimmten Füllgrad die Daten in
einen Rutsch auf die Platte schreibt. Das erhöht die Geschwindigkeit, mit der
eine Datei gespeichert werden kann. Du hast mit Deinem Beispiel einen
Buffer mit 826 Zeilen auf die Platte geschrieben. Die restlichen 174 Zeilen
liegen noch im Speicher und werden erst mit einem CloseFile (oder
Programmende) 'geflusht'.

Grüße ... Kiffi

Verfasst: 09.04.2006 13:17
von Hyper
Ok, das verstehe ich. Man muss es nur wissen. Ich hatte in meinem Programm relativ lange gesucht, bis ich die Ursache fand.

@ts-soft: Ich dachte, wir hätten gemeinsam das Ziel, PB4.00 zu testen...

Verfasst: 09.04.2006 13:21
von Kiffi
> Ok, das verstehe ich.

prima! Dann kannst Du ja jetzt den Betreff Deines Postings ändern, damit
andere PureBoardler keinen Schreck bekommen.

Grüße ... Kiffi

Verfasst: 09.04.2006 13:29
von Hyper
Klar doch, war auch schon dabei. Danke und noch einen schönen Sonntag.

Verfasst: 09.04.2006 13:34
von ts-soft
>> @ts-soft: Ich dachte, wir hätten gemeinsam das Ziel, PB4.00 zu testen...
Machen wir doch auch, aber der Testcode darf nicht fehlerhaft sein :wink:
Wenn Du also Fehler findest, guck Dir Deinen Code noch 5x an und überpüfe
jeden Befehl anhand der Hilfe. Wenn Du Dir nicht sicher bist, dann wähle
einen anderen Titel oder frage, ob dies ein Bug ist <)