# Ansatz zum löschen der Dateien nach einer bestimmten Zeitspanne



## lawkan (31 Oktober 2014)

Hallo liebe SPSler,

Ich arbeite an einem Wago-Controller (750-880), der soll als reiner Archivdatenlogger programmiert werden in ST-Sprache in Codesys 2.3

Das Problem, dass ich mittlerweile habe ist dass ich irgendwie einen Ansatz oder Ideen brauche um folgendes geschickt zu lösen:

Also: es wird pro Tag eine csv-Datei erzeugt. 
je 30 min wird die Datei vom Controller zum FTP-Server (Leitrechner) übertragen.
Der Name der Datei ist mit der Zeit variabel, d.h. wenn das Datum des Tages sich ändert wird sich der Dateiname auch ändern und somit eine neue Datei erzeugt.
bis jetzt kein Problem. Ich möchte aber, dass nach einer bestimmten Zeitdauer die alten Dateien von dem Controller gelöscht werden, also sagen wir mal in dem Controller sind 10 Dateien von den letzten 10 Tagen vorhanden; und mein Zeitdauer um alte Dateien zu löschen ist 10 Tage, das heißt die aller erste erzeugte Datei muss gelöscht werden, die anderen 9 aber nicht.

So, das ist die Problematik und hoffe dass ich sie verständlich erklärt habe... 
Wenn jemand mir irgendwie dabei helfen kann um einen Ansatz oder Vorgehensweise zu finden wäre echt toll...
Ich bedanke mich recht herzlich im voraus

Gruß
Lawkan


----------



## Dr.MirakulixX (31 Oktober 2014)

Also brauchst du im Prinzip ein Schieberegister was immer die älteste Datei auf Position eins hat und diese dann löscht. Wie du die Datei generell löschst ist bekannt ?


----------



## gravieren (31 Oktober 2014)

Ich würde die Datei löschen, sobald diese korrekt zum FTP-Server übertragen wurde.


----------



## lawkan (3 November 2014)

@ Dr.MirakulixX: Danke schön für deine Antwort. ja wie das Datei gelöscht wird ist kein Problem. Der Ansatz mit dem Schieberegister hört sich gut an, aber wie soll das dann mit dem Codieren aussehen :| ? kannste vllt paar Zeilen dazu schreiben wie das realisiert werden kann auf die Code Ebene ?

@ gravieren: Danke schön für deine Antwort. Es muss aber nicht gleich nach der Übertragung gelöscht werden, sondern quasi erst nach eine zu bestimmende Weile, Damit man die möglichkeit haben kann innerhalb dieser Zeit auf die Daten zurückgreifen könne  wenn man sie braucht. das ist halt die Anforderung


----------



## lawkan (3 November 2014)

Ich glaub ich muss dazu erwähnen dass ich die Datei-Übertragung per FTP in einem einzelnen niederpriorisierten Task implementiert habe. 
So, Der Name der Datei vergebe ich aber in einer anderen Task (Verarbeitungstask).


----------



## EvilIce (4 November 2014)

Mach dir ein Array für deine Dateinamen mit 10 Plätzen. Immer wenn du eine neue Datei anlegen willst, löscht du die Datei an Platz 1, schiebst dann alle anderen um einen Platz wieder nach vorne und schreibst den neusten Dateinamen auf Platz 10. Sollte eigentlich so funktionieren und der Idee von Dr.MirakulixX entsprechen.


----------



## PN/DP (4 November 2014)

Gibt es bei dem Controller eine DIR-Methode?
Ich würde zweimal mit der DIR-Methode alle Dateien auflisten lassen.
Beim ersten Mal die 9 jüngsten Dateien in eine Liste mit 9 Einträgen einsortieren, beim zweiten Mal (falls mehr als 9 Dateien vorhanden sind) alle Dateien löschen, welche nicht in der Liste stehen.

Harald


----------



## gravieren (4 November 2014)

PN/DP schrieb:


> Gibt es bei dem Controller eine DIR-Methode?
> Ich würde zweimal mit der DIR-Methode alle Dateien auflisten lassen.
> Beim ersten Mal die 9 jüngsten Dateien in eine Liste mit 9 Einträgen einsortieren, beim zweiten Mal (falls mehr als 9 Dateien vorhanden sind) alle Dateien löschen, welche nicht in der Liste stehen.
> 
> Harald


DIR gibt es.


----------



## lawkan (5 November 2014)

EvilIce schrieb:


> Mach dir ein Array für deine Dateinamen mit 10 Plätzen. Immer wenn du eine neue Datei anlegen willst, löscht du die Datei an Platz 1, schiebst dann alle anderen um einen Platz wieder nach vorne und schreibst den neusten Dateinamen auf Platz 10. Sollte eigentlich so funktionieren und der Idee von Dr.MirakulixX entsprechen.



das klingt gut... aber ich muss es mir überlegen ob es sinnvoll ist für mein Programm und wie ich alles zusammen hinbekomme...


----------



## lawkan (5 November 2014)

PN/DP schrieb:


> Gibt es bei dem Controller eine DIR-Methode?
> Ich würde zweimal mit der DIR-Methode alle Dateien auflisten lassen.
> Beim ersten Mal die 9 jüngsten Dateien in eine Liste mit 9 Einträgen einsortieren, beim zweiten Mal (falls mehr als 9 Dateien vorhanden sind) alle Dateien löschen, welche nicht in der Liste stehen.
> 
> Harald



ja die Dir-Methoden gibt es... und ich werde es ausprobieren... sollte eig klappen. Danke schön.


----------



## lawkan (5 November 2014)

also der Ansatz mit den Dir-Methoden war super, ich habs ausprobiert und es läuft super. Vielen Dank Harald.

ich hab mir einen Array mit einer bestimmten Anzahl von strings definiert. und dann frag ich den Verzeichnis nach allen Dateien ab und liste sie in dem Array. im nächsten Schritt lese ich das Erstelldatum jede einzelne Datei und wenn die Zeit überschritten ist lösche ich die Datei.

also vielen Dank an allen die sich hier mühe gegeben haben und geholfen haben.


----------



## lawkan (5 November 2014)

```
Deklaration:
	(* Nach Datei suchen *)
	dwDirHandle			: DWORD;
	uRetRead				: UDINT;
	DirInfo				: DIRECTORY_INFO;
	Datei_Liste				: ARRAY [1..100] OF STRING;
[INDENT]stDirEintrag		                : STRING;[/INDENT]
	stDirName				: STRING;
	pos					: INT := 1;
	j					: INT;


	(* Datei Löschen *)
	Fzeit					: FILETIME;
	FTP_Zeit				: DT;
	FileErstellZeit			: DT;
	ist_FileGeloescht		        : BOOL;

Code:
	IF Delete_aktiv THEN
		pos := 1;	(* Laufvariable initialisieren *)
[INDENT]	dwDirHandle := SysDirOpen('S:\PLC\');[/INDENT]
		IF dwDirHandle <> 0 THEN
[INDENT]		uRetRead := SysDirRead(hDir:= dwDirHandle, stDirEntry:= stDirEintrag, pDirInfo:= ADR(DirInfo));[/INDENT]
[INDENT]		WHILE uRetRead <> 0 DO[/INDENT]
[INDENT]			(* Suche nur nach csv-Dateien *)[/INDENT]
[INDENT]			IF NOT DirInfo.bDirectory THEN[/INDENT]
[INDENT]				IF FINDP(stDirEintrag,'.csv',1)<>0 OR FINDP(stDirEintrag,'.CSV',1)<>0 THEN[/INDENT]
[INDENT]					Datei_Liste[pos] := stDirEintrag;[/INDENT]
[INDENT]					pos := pos + 1;[/INDENT]
[INDENT]				END_IF[/INDENT]
[INDENT]			END_IF[/INDENT]
[INDENT=2]		uRetRead := SysDirRead(hDir:= dwDirHandle, stDirEntry:= stDirEintrag, pDirInfo:= ADR(DirInfo));[/INDENT]
[INDENT]		END_WHILE[/INDENT]
[INDENT]		dwDirHandle := 0;[/INDENT]
[INDENT]	END_IF[/INDENT]


[INDENT]	FOR j:=1 TO pos-1 DO[/INDENT]
[INDENT]		FTP_Zeit := SysRtcGetTime(TRUE);	(* Systemzeit ermitteln *)[/INDENT]
[INDENT]		IF SysFileGetTime(FileName:= Datei_Liste[j], ftFileTime:= ADR(Fzeit)) THEN[/INDENT]
[INDENT]			FileErstellZeit := Fzeit.dtCreation;[/INDENT]
[INDENT]		END_IF[/INDENT]
[INDENT]		IF ABS(DAYS_DELTA(DT_TO_DATE(FTP_Zeit), DT_TO_DATE(FileErstellZeit))) >= FTP_FileZeitIntervall THEN[/INDENT]
[INDENT]			ist_FileGeloescht := SysFileDelete(FileName:= Datei_Liste[j]);[/INDENT]
[INDENT]		END_IF[/INDENT]
[INDENT]	END_FOR[/INDENT]


	END_IF
```


----------

