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