Ce bloc fonction de exécuter dans la tâche Retour, renvoie des informations sur des fichiers ou des répertoires individuels ou sur des fichiers ou des répertoires contenus dans un répertoire. En passant PathNane le nom complet du fichier ou du répertoire du chemin et l'activation Init, si le fichier ou le répertoire est présent, les informations sont renvoyées.
Liste tous les fichiers d'un dossier
En définissant dans PathName le nom d'un dossier suivi du filtre "/*.*", activant Init la liste de fichiers est initialisée et le premier fichier trouvé est renvoyé. À chaque commande Next une recherche d'un nouveau fichier est effectuée, si le fichier de sortie est trouvé Found il est activé pour une boucle et son nom est renvoyé à Name. Fini la liste de tous les fichiers présents sur commande Next la sortie n'est plus activée Found e Name est listé.
Il est également possible d'effectuer un filtrage sur les fichiers à restituer. Par exemple, si vous utilisez "/*.htm", seuls les fichiers avec l'extension "htm" sont renvoyés. La sortie IsDir il est activé si le nom du fichier renvoyé est celui d'un sous-répertoire
Il remplace SysDirListing
Remplace le bloc fonction SysDirListing, en changeant le type des paramètres d'entrée et de sortie de chaîne à pointeur à chaîne. La déclaration précédente:
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;
Devient:
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;
Verrouillage de fonction
CODESYS : indisponible
LogicLab : eLLabXUnified12Lib
Description
Init (BOOL) A l'activation, l'index des fichiers du répertoire indiqué est initialisé et le nom du premier fichier trouvé est renvoyé.
Next (BOOL) A l'activation, le nom du fichier pointé par l'index dans le répertoire indiqué est retourné. L'index est incrémenté en pointant sur le fichier suivant.
PathName (@STRING) Nom du fichier complet avec chemin.
Pour détecter les données d'un fichier spécifique, définissez son chemin et son nom, par exemple C:\MyDir\MyFile.log.
Pour détecter les données d'un répertoire, définissez son exemple de chemin C:\MyDir\MyFile.log.
Pour lister les fichiers dans un répertoire, définissez le chemin avec l'exemple de filtre C:\MyDir\*.log.
Found (BOOL) S'active pour une boucle si sur commande Init o Next un fichier a été trouvé.
Fault (BOOL) S'active pour une boucle si erreur d'exécution.
IsDir (BOOL) Actif si le nom de fichier renvoyé appartient à un sous-répertoire.
Size (UDINT) Taille du fichier.
FTime (UDINT) Date de la dernière modification du fichier en heure d'époque (UTC).
Name (@STRING) Nom de fichier, y compris toute extension
Exemples
Comment utiliser les exemples.
ST_SysGetFileInfos: En se connectant en telnet sur le port indiqué, le nom des fichiers et répertoires trouvés dans le chemin défini est retourné.
ST_DeleteOldestFiles: Activer la variable à partir du débogage Delete, les fichiers présents dans le répertoire défini sont vérifiés et les plus anciens sont supprimés pour garder le nombre total de fichiers égal à la valeur de Threshold.
D'autres exemples se trouvent dans la fonction Sysremove.
Laboratoire logique (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]