Seite 1 von 7
Dateien schreiben - Returncode
Verfasst: 14.08.2006 11:21
von Prowokant
Hallo,
ich traue mich ja kaum zu fragen, aber ich habe Probleme beim Schreiben von Dateien auf Platte.
Weder das Suchen in der Hilfe und in diversen Foren, noch das eigene Probieren waren bisher von Erfolg gekrönt.
Mein Problem:
Ich möchte nach dem Schreiben wissen, ob es geklappt hat. Ich würde also ganz gern den Returncode auswerten. Schließlich ist so ein Dateiträger ja z.B. auch mal voll. Ich verstehe gar nicht, warum das in den vielen Codefragmenten, die man so findet, überhaupt nicht berücksichtigt wird. Wenn ich auf eine fast volle Diskette schreibe, so ist das Ergebnis nicht das, was ich mir wünsche. Es kann doch nicht sein, dass PB4 hier nichts an Funktionalität zur Verfügung stellt. Oder doch?
Bla
Verfasst: 14.08.2006 11:30
von Vermilion
Ergebniss = CreateFile(#Datei, DateiName$)
So, wie es in der Hilfe steht, wenn diese Funktion 0 zurückgibt (Also wenn Ergebniss = 0), dann konnte die Datei nicht erstellt werden.
So, und wie groß die Datei am Ende ist, kommt darauf an, was du in sie schreibst.
Verfasst: 14.08.2006 11:30
von bobobo
Versuch's mal damit.
Code: Alles auswählen
If CreateFile(0, "d:\PureBasicTestFile.txt")
Debug WriteStringN(0, " This is a PureBasic file test")
Debug WriteString(0, "Now it's on ")
Debug WriteString(0, "the same line.")
CloseFile(0)
Else
MessageRequester("PureBasic", "Error: can't write the file", 0)
End
EndIf
Verfasst: 14.08.2006 11:54
von Prowokant
Ich weiß, wie man den Returncode beim Öffnen von Dateien abfragt bzw. auswertet. Eure Antworten lösen leider nicht das Problem.
Mir geht es um des Schreiben, also "WriteStringN" und Konsorten. Wenn man da einen Fehler bekommt, weil die Platte voll ist, jemand den USB-Stick rauszieht, die Diskette entfernt usw. usw. dann finde ich keine Möglichkeit, womit ich diese Fehlerfälle im Programm abfangen kann.
Verfasst: 14.08.2006 11:58
von bobobo
hab ich doch grade gepostet .. beachte die Debugs im Code
WritestringN() liefert sehr wohl einen Rückgabewert (wie es aussieht ist es die Länge des geschriebenen Strings plus CLRF bei Writestringn())
Das kann man bestens nach writestring() bzw. writestringn() auswerten
wenn die Länge nicht zur Stringlänge passt, dann ist was faul
Hab's dem André gemeldet wegen Dokumentationserweiterung
Verfasst: 14.08.2006 12:14
von Prowokant
Das hatte ich auch schon probiert. Das funktioniert nicht.
Unschön wäre hier natürlich, dass man immer erst die Länge der Ausgabe berechnen müsste, um prüfen zu können, ob das Schreiben geklappt hat.
Code: Alles auswählen
OpenConsole()
AusgabeDatei$ = "A:\xxx.txt"
Zaehler.l = 0
If CreateFile(1, AusgabeDatei$)
Repeat
Zaehler = Zaehler + 1
AusgabeSatz$ = "Zeile #" + Right("0000000" + Str(Zaehler),7)
RC = WriteStringN(1, AusgabeSatz$)
PrintN(Str(Zaehler) + " - RC: " + Str(RC))
Until Zaehler > 80000
CloseFile(1)
Else
PrintN("Fehler!")
EndIf
PrintN("Done!")
End
Auf der Diskette sind noch knapp 100K frei.
Jede Zeile hat 16 Zeichen inkl. CRLF.
Das liefert mir RC - mit konstanter Boshaftigkeit bis zum 80001. Satz.
80000 ist der gewählte Notnagel, damit das Progrämmchen nicht hängt.
Ich habe unter W2k mit der PB4-Demo getestet.
Heute Abend probiere ich es zur Sicherheit mal unter XP mit der Vollversion aus und poste, wenn das Ergebnis abweichen sollte.
Verfasst: 14.08.2006 13:16
von bobobo
Die Erweiterung des Codes durch
Code: Alles auswählen
If RC<>Len(AusgabeSatz$+#CRLF$)
PrintN("konnte nicht schreiben")
EndIf
VOR dem PrintN(Str(Zaehler) + " - RC: " + Str(RC))
ist eigentlich kein unerträglicher Aufwand
Verfasst: 14.08.2006 13:54
von Prowokant
> Die Erweiterung des Codes durch
> .....
> VOR dem PrintN(Str(Zaehler) + " - RC: " + Str(RC))
> ist eigentlich kein unerträglicher Aufwand
Das ist Geschmacksache.
Ich könnte, wie offenbar du, auch gut damit leben, wenn es
funktionieren würde!
Vielleicht drücke ich mich ja unklar aus, aber der "WriteStringN"
liefert in meinem Testbeispiel IMMER den Returncode 16 (Die
Länge des Ausgabestrings). Soll heißen: "WriteStringN" liefert auch
16, wenn die Ausgabe, wegen voller Diskette, nicht mehr klappt.
Der eingefügte Code
Code: Alles auswählen
If RC<>Len(AusgabeSatz$+#CRLF$)
PrintN("konnte nicht schreiben")
EndIf
würde nichts bringen!
Der Rückgabewert von "WriteStringN" ist somit nicht geeignet, um
Schreibfehler abzufangen. Wenn es überhaupt geht, dann muss es
irgendwie anders gehen.
Ich kann mir nicht vorstellen, dass es nicht geht, denn ohne die
Möglichkeit solche Fehler abzufangen, kann man Ausgaben in
Dateien beruhigt vergessen und was will man mit einer Programmiersprache,
mit der man nicht vernünftig in Dateien schreiben kann.
Verfasst: 14.08.2006 13:54
von AND51
Wollte noch mal anmerken, dass du hinterher mit FileSize() auswerten kannst, wie groß die Datei tatsächlich ist und ob es sie überhaupt gibt. Nur, falls das bisher noch nicht angesprochen wurde.
Verfasst: 14.08.2006 13:58
von Kaeru Gaman
> Nur, falls das bisher noch nicht angesprochen wurde.
so lang is der thread doch nicht, dass du ihn nicht hättest lesen können...
@topic
das ist allerding ein interessanter punkt.
wie wird es denn bei den API-Befehlen gelöst?
ich gebe Prowo recht, dass eigentlich eine rückmeldung bei fehler erfolgen sollte,
aber ich halte es für möglich, dass das generell irgendwie vernachlässigt wurde, auch API-seitig.