Datei - interner Zeiger (BEISPIEL)
(* Beispiel wie CAA.FILE-library - Funktionsblöcke für Dateiposition zu verwenden sind *)
PROGRAM FILE.POINT_PRG
VAR
xFilePosInit: BOOL:=FALSE;
uiFilePosState: UINT:=0;
udiActualPosition: UDINT:=0;
udiActualEoFPosition: UDINT:=0;
sFileName: CAA.FILENAME:= 'TestFile.txt';
hFile: CAA.HANDLE;
filop: FILE.Open;
filcl: FILE.Close;
filgp: FILE.GetPos;
filsp: FILE.SetPos;
fileof: FILE.EOF;
END_VAR
IF NOT xFilePosInit THEN
filop(xExecute:=FALSE);
filcl(xExecute:=FALSE);
filgp(xExecute:=FALSE);
filsp(xExecute:=FALSE);
fileof(xExecute:=FALSE);
xFilePosInit:=TRUE;
uiFilePosState:=0;
ELSE
CASE uiFilePosState OF
0:(* Datei öffnen *)
filop.sFileName:=sFileName;
filop.eFileMode:=FILE.MRDWR;
filop.xExclusive:=TRUE;
filop( xExecute:=TRUE);
IF filop.xDone THEN
hFile:=filop.hFile;
uiFilePosState:=1;
END_IF
IF filop.xError THEN
(* Fehlerbehandlung *)
;
END_IF
1: (* aktuelle interne Position von Dateizeiger abfragen *)
filgp.hFile:= hFile;
filgp( xExecute:=TRUE);
IF filgp.xDone THEN
udiActualPosition:=filgp.udiPos;
uiFilePosState:=2;
END_IF
IF filgp.xError THEN
(* Fehlerbehandlung *)
;
END_IF
2:(* Abfrage - Dateiende erreicht *)
fileof.hFile:= hFile;
fileof( xExecute:=TRUE);
IF fileof.xDone THEN
IF fileof.xEOF THEN
udiActualEoFPosition:=udiActualPosition;
END_IF
uiFilePosState:=3;
END_IF
IF filgp.xError THEN
(* Fehlerbehandlung *)
;
END_IF
3: (* interne Position von Dateizeiger setzen *)
filsp.hFile:= hFile;
filsp.udiPos:=udiActualEoFPosition - 5;
IF filsp.udiPos < 0 THEN
filsp.udiPos:=0;
END_IF
filsp( xExecute:=TRUE);
IF filsp.xDone THEN
uiFilePosState:=4;
END_IF
IF filgp.xError THEN
(* Fehlerbehandlung *)
;
END_IF
4:(* Datei schließen *)
filcl.hFile:=hFile;
filcl( xExecute:=TRUE);
IF filcl.xDone THEN
uiFilePosState:=5;
END_IF
IF filcl.xError THEN
(* Fehlerbehandlung *)
;
END_IF
5: (* Ende vom Beispiel *)
;
END_CASE
END_IF