Acest bloc funcțional de la rulați în sarcina Înapoi, returnează informații despre fișiere sau directoare individuale sau despre fișiere sau directoare conținute într-un director. Trecând înăuntru PathNane fișierul complet sau numele directorului căii și activarea Init, dacă fișierul sau directorul este prezent, informațiile sunt returnate.
Enumerați toate fișierele dintr-un folder
Prin definirea în PathName numele unui folder urmat de filtrul „/*.*”, activând Init lista de fișiere este inițiată și primul fișier găsit este returnat. La fiecare poruncă Next se efectuează căutarea unui fișier nou, dacă este găsită ieșirea fișierului Found este activat pentru o buclă și numele acestuia este returnat Name. S-a terminat lista tuturor fișierelor prezente la comandă Next ieșirea nu mai este activată Found e Name este listat.
De asemenea, este posibil să se efectueze un filtru asupra fișierelor care urmează să fie returnate. De exemplu, folosind „/*.htm” sunt returnate numai fișierele cu extensia „htm”. Ieșirea IsDir este activat dacă numele fișierului returnat este cel al unui subdirector
Înlocuiește SysDirListing
Înlocuiește blocul funcțional SysDirListing, schimbarea tipului de parametri de intrare și ieșire de la string la indicatorul string. Declarația anterioară:
VAR
DList : SysDirListing; (* Get file infos *)
END_VAR
DList.PathName:='C:/';
DList();
IF (DList.Found) THEN i:=SysVfprintf(Fp, ADR('%s'), VR_TYPE#STRING_TYPE, ADR(DList.Name)); END_IF;
devine:
VAR
DList : SysGetFileInfos; (* Get file infos *)
END_VAR
DList.PathName:=ADR('C:/');
DList();
IF (DList.Found) THEN i:=SysVfprintf(Fp, ADR('%s'), VR_TYPE#STRING_TYPE, DList.Name); END_IF;
Blocarea funcției
CODESYS: Indisponibil
LogicLab: eLLabXUnified12Lib
Descriere
Init (BOOL) La activare, se inițializează indexul fișierelor din directorul indicat și se returnează numele primului fișier găsit.
Next (BOOL) La activare, se returnează numele fișierului indicat de indexul din directorul indicat. Indexul este incrementat arătând spre următorul fișier.
PathName (@STRING) Numele fișierului complet cu calea.
Pentru a detecta datele unui anumit fișier, definiți calea și numele acestuia, de exemplu C:\MyDir\MyFile.log.
Pentru a detecta date dintr-un director, definiți calea acestuia, de exemplu C:\MyDir\MyFile.log.
Pentru a lista fișierele dintr-un director, definiți calea cu exemplul de filtru C:\MyDir\*.log.
Found (BOOL) Se activează pentru o buclă dacă este la comandă Init o Next un fișier a fost găsit.
Fault (BOOL) Se activează pentru o buclă dacă eroare de execuție.
IsDir (BOOL) Activ dacă numele fișierului returnat aparține unui subdirector.
Size (UDINT) Mărime fișier.
FTime (UDINT) Data ultimei modificări a fișierului în Epoch time (UTC).
Name (@STRING) Numele fișierului, inclusiv orice extensie
Exemple
ST_SysGetFileInfos: Prin conectarea în telnet la portul indicat, se returnează finalul fișierelor și directoarelor găsite în setul de căi.
ST_DeleteOldestFiles: Activarea variabilei de la debug Delete, fișierele prezente în directorul definit sunt verificate și cele mai vechi sunt șterse pentru a menține numărul de fișiere totale egal cu valoarea de Threshold.
Alte exemple se găsesc în funcție Sysremove.
LogicLab (Ptp116, ST_SysGetFileInfos)
PROGRAM ST_SysGetFileInfos
VAR
i : UDINT; (* Auxiliary variable *)
CaseNr : USINT; (* Program case *)
FFound : USINT; (* Files found *)
Fp : eFILEP; (* File pointer array *)
DFound : USINT; (* Directories found *)
LDTime : LDATETIMESTRUCT; (* Date/Time struct *)
TCPServer : SysTCPServer; (* TCP server *)
DList : SysGetFileInfos; (* Get file infos *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_SysGetFileInfos"
// *****************************************************************************
// When a telnet client connect to port 1200 it's executed the listing of
// a directory.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Program initializations.
IF (SysFirstLoop) THEN
// TCPServer initialization.
TCPServer.FilesArr:=ADR(Fp); //Files array
TCPServer.LocalAdd:=ADR('0.0.0.0'); //Local address
TCPServer.LocalPort:=1200; //Local port
TCPServer.MaxConn:=1; //Accepted connections
TCPServer.FlushTm:=50; //Flush time (mS)
TCPServer.LifeTm:=30; //Life time (S)
TCPServer.RxSize:=128; //Rx buffer size
TCPServer.TxSize:=128; //Tx buffer size
// Directory listing initialization.
DList.PathName:=ADR('/tmp/*.*'); //Directory to list
DList.PathName:=ADR('C:/*.*'); //Directory to list
END_IF;
// -------------------------------------------------------------------------
// TCP SERVER MANAGEMENT
// -------------------------------------------------------------------------
// Manage the TCP server and directory listing.
DList(); //Directory listing
TCPServer(); //TCPServer management
TCPServer.Enable:=TRUE; //TCPServer enable
// Check if a client has been connected.
IF NOT(SysFIsOpen(Fp)) THEN CaseNr:=0; RETURN; END_IF;
// -------------------------------------------------------------------------
// PROGRAM CASES
// -------------------------------------------------------------------------
// Program case management.
CASE (CaseNr) OF
// ---------------------------------------------------------------------
// Init listing.
0:
DFound:=0; //Directories found
FFound:=0; //Files found
DList.Init:=TRUE; //Init listing
i:=SysVfprintf(Fp, ADR('%s$r$n$r$n'), VR_TYPE#STRING_TYPE, ADR('"SysDirListing" example program'));
CaseNr:=10; //Program case
// ---------------------------------------------------------------------
// Init listing.
1:
DList.Next:=TRUE; //Next command
CaseNr:=10; //Program case
// ---------------------------------------------------------------------
// Reset commands.
10:
DList.Init:=FALSE; //Init listing
DList.Next:=FALSE; //Next command
// If file found returns file data.
IF (DList.Found) THEN
// Returns Date/Time.
i:=SPLIT_DT(TO_DATE_AND_TIME(DList.FTime), ADR(LDTime.Year), ADR(LDTime.Month), ADR(LDTime.Day), ADR(LDTime.Hours), ADR(LDTime.Minutes), ADR(LDTime.Seconds));
i:=SysVfprintf(Fp, ADR('%02d/'), VR_TYPE#UINT_TYPE, ADR(LDTime.Day));
i:=SysVfprintf(Fp, ADR('%02d/'), VR_TYPE#UINT_TYPE, ADR(LDTime.Month));
i:=SysVfprintf(Fp, ADR('%04d'), VR_TYPE#UINT_TYPE, ADR(LDTime.Year));
i:=SysVfprintf(Fp, ADR(' %02d:'), VR_TYPE#UINT_TYPE, ADR(LDTime.Hours));
i:=SysVfprintf(Fp, ADR('%02d'), VR_TYPE#UINT_TYPE, ADR(LDTime.Minutes));
// Returns directory label or file length.
IF (DList.IsDir) THEN
DFound:=DFound+1; //Directories found
i:=SysVfprintf(Fp, ADR(' %10s'), VR_TYPE#STRING_TYPE, ADR('[DIR]'));
ELSE
FFound:=FFound+1; //Files found
i:=SysVfprintf(Fp, ADR(' %10d'), VR_TYPE#UDINT_TYPE, ADR(DList.Size));
END_IF;
// Returns file name.
i:=SysVfprintf(Fp, ADR(' %s$r$n'), VR_TYPE#STRING_TYPE, DList.Name);
CaseNr:=20; //Program case
RETURN;
END_IF;
// All files in the directory have been listed.
i:=SysVfprintf(Fp, ADR('%16d Files$r$n'), VR_TYPE#USINT_TYPE, ADR(FFound));
i:=SysVfprintf(Fp, ADR('%16d Directory$r$n'), VR_TYPE#USINT_TYPE, ADR(DFound));
CaseNr:=30; //Program case
// ---------------------------------------------------------------------
// Wait until the output buffer is empty.
20, 30:
IF (TO_UDINT(SysFGetOSpace(Fp)) <> SysFGetOBfSize(Fp)) THEN RETURN; END_IF;
IF (CaseNr = 30) THEN i:=Sysfclose(Fp); END_IF; //Close socket
CaseNr:=1; //Program case
END_CASE;
// [End of file]
LogicLab (Ptp116, ST_DeleteOldestFiles)
PROGRAM ST_DeleteOldestFiles
VAR
CaseNr : USINT; (* Program case *)
FFound : USINT; (* Files found *)
i : UDINT; (* Auxiliary variable *)
DList : SysGetFileInfos; (* Directory listing *)
Delete : BOOL; (* Delete files command *)
FDate : UDINT; (* File date (Epoch) *)
FName : STRING[ 64 ]; (* File name *)
Threshold : USINT; (* File number threshold *)
Dir : STRING[ 32 ]; (* Directory name *)
DirWithFilter : STRING[ 32 ]; (* Directory name with filter *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_DeleteOldestFiles"
// *****************************************************************************
// If set by debug the "Delete" variable the program maintains a defined number
// of files into a directory. If there are more than defined the oldest are
// deleted.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// PROGRAM INITIALIZATION
// -------------------------------------------------------------------------
// Execute initializations.
IF (SysFirstLoop) THEN
Threshold:=2; //File number threshold
Dir:='C:/MyDir'; //Directory to list
DirWithFilter:=CONCAT(Dir, '/*.*'); //Directory to list with filter to get all its files
DList.PathName:=ADR(DirWithFilter); //Directory to list
END_IF;
// -------------------------------------------------------------------------
// EXECUTE THE CONTROL
// -------------------------------------------------------------------------
// Check if command set.
IF NOT(Delete) THEN
CaseNr:=0; //Program case
ELSE
// Manage the directory listing.
DList(); //Directory listing
DList.Init:=FALSE; //Init listing
DList.Next:=FALSE; //Next command
// ---------------------------------------------------------------------
// PROGRAM CASES
// ---------------------------------------------------------------------
// Program case management.
CASE (CaseNr) OF
// -----------------------------------------------------------------
// Init directory listing.
0:
FFound:=0; //Files found
FDate:=SysDateTime; //File date (Epoch)
DList.Init:=TRUE; //Init listing
CaseNr:=CaseNr+1; //Program case
// -----------------------------------------------------------------
// If file found returns file data.
1:
IF NOT(DList.Found) THEN CaseNr:=CaseNr+1; RETURN; END_IF;
FFound:=FFound+1; //Files found
DList.Next:=TRUE; //Next command
// Check if file date is older previous.
IF (DList.Time > FDate) THEN RETURN; END_IF;
FDate:=DList.Time; //File date (Epoch)
i:=SysVsnprintf(ADR(FName), SIZEOF(FName), ADR('%s'), STRING_TYPE, ADR(Dir));
i:=SysCVsnprintf(ADR(FName), SIZEOF(FName), ADR('/%s'), STRING_TYPE, DList.Name);
// -----------------------------------------------------------------
// If number of files in directory is greater than the threshold,
// the oldest is deleted.
2:
IF (FFound <= Threshold) THEN Delete:=FALSE; RETURN; END_IF;
i:=SysFileRemove(ADR(FName)); //Delete file
CaseNr:=0; //Program case
END_CASE;
END_IF;
// [End of file]