ich möchte auch etwas dazu sagen, da ich mich mit dem Datei-Thema ebenfalls beschäftige... Fred hat bestimmt aus performance grüden die sache so gemacht, doch für alles gibt es abhilfe (dafür ist ein wenig projekt-werbung nötig
Das "MemFile" (mein kleines projekt) prinzip ist einfach: alle File-Befehle von PB habe ich "neugeschrieben" so dass sie eine im Ram geladene Datei modifizieren kann. Ich habe hier ebenfalls die Befehle "MUseFile(*FileID)" eingebaut. (für die DLL-Version)
*FileID ist hierbei ein GLOBALER Zeiger, der von allen "Read/Write" befehlen genutzt wird... Wäre es nicht so müsste mein Programm zuerst den Zeiger jedesmal darauf Testen, ob er gültig ist. Gültig ist er nur wenn er 2 Bedinungen erfüllt. Man kann den *CurrentFile zeiger nur mit 0 oder einem gültigen zeiger initialisieren. Deshalb kann ich den read/write -befehel einfach abbrechen wenn FileID = 0 ist, und brauche nicht FileID 2-3 zu checken (+prozeduren-sprung zeit etc...)
Wenn ich also meine ReadWrite-Befehle jedesmal mit einer *FileID
ausstatten würde, müsste ich diese (vorsichtshalber) testen, wodurch performance verloren gehen würde, und alles 3-6x so lange dauert.
Nun kann ich dazu keinen weiteren Tipp geben, als selbst kleine 'Wrapper-Routinen' zu schreiben, sollte sich an der Parameter-Auswahl nichts ändern.
----
Beispiel: (ungetestet)
Code: Alles auswählen
Global UseByte.b
Procedure.l D_ReadLong(*FileID)
if UseByte = 1 : repeat : until UseByte = 0 : UseByte = 1 : endif
UseByte = 1
UseFile(*FileID)
result.l = Readlong()
UseByte = 0
procedurereturn result
EndProcedure
Procedure D_FileSeek(*FileID, pos.l)
if UseByte = 1 : repeat : until UseByte = 0 : UseByte = 1 : endif
UseByte = 1
UseFile(*FileID)
result.l = FileSeek(pos)
UseByte = 0
procedurereturn result
EndProcedure
Procedure.l D_Loc(*FileID)
if UseByte = 1 : repeat : until UseByte = 0 : UseByte = 1 : endif
UseByte = 1
UseFile(*FileID)
result.l = Loc()
UseByte = 0
procedurereturn result
EndProcedure
procedure ClearUseByte()
UseByte=0
endprocedure
bei einem fehler sollte man dann dieses UseByte auch löschen, da sonst jeder weitere datei zugriffs-versuch in einer endlosschleife enden würde
edit: ein paar Verben eingefügt