SysGetFileInfos, Datei-Infos abrufen

Liste

Diese Seite ist Teil der IEC 61131-3 Programmierhandbuch. Gehen Sie zum Index.

Dieser Funktionsbaustein aus Ausführen in Aufgabe Zurück, gibt Informationen zu einzelnen Dateien oder Verzeichnissen oder zu Dateien oder Verzeichnissen zurück, die in einem Verzeichnis enthalten sind. Vorbeigehen PathNane den vollständigen Datei- oder Verzeichnisnamen des Pfads und der Aktivierung InitWenn die Datei oder das Verzeichnis vorhanden ist, werden die Informationen zurückgegeben.

Listen Sie alle Dateien in einem Ordner auf

Durch die Definition in PathName der Name eines Ordners gefolgt vom Filter „/*.*“, aktivierend  Init Die Dateiliste wird initialisiert und die erste gefundene Datei wird zurückgegeben. Bei jedem Befehl Next eine Suche nach einer neuen Datei wird durchgeführt, wenn die Ausgabedatei gefunden wird Found Es wird für eine Schleife aktiviert und sein Name wird an zurückgegeben Name. Fertige die Liste aller Dateien an, die auf Befehl vorhanden sind Next der Ausgang wird nicht mehr aktiviert Found e Name ist aufgelistet.

Es ist auch möglich, die zurückzugebenden Dateien zu filtern. Beispielsweise werden bei Verwendung von „/*.htm“ nur Dateien mit der Erweiterung „htm“ zurückgegeben. Der Ausgang IsDir es wird aktiviert, wenn der Name der zurückgegebenen Datei der eines Unterverzeichnisses ist

Ersetzt SysDirListing

Ersetzt den Funktionsbaustein SysDirListingÄndern des Typs der Eingabe- und Ausgabeparameter von Zeichenfolge zu Zeiger zu Zeichenfolge. Die vorherige Aussage:

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;

Wird:

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;
Informationskreis

Funktionssperre

CODESYS: nicht verfügbar

LogikLab: eLLabXUnified12Lib

Beschreibung

Init (BOOL) Bei der Aktivierung wird der Index der Dateien im angegebenen Verzeichnis initialisiert und der Name der ersten gefundenen Datei zurückgegeben.
Next (BOOL) Bei der Aktivierung wird der Name der Datei zurückgegeben, auf die der Index im angegebenen Verzeichnis verweist. Der Index wird erhöht, indem auf die nächste Datei gezeigt wird.
PathName (@STRING) Dateiname komplett mit Pfad.
Um die Daten einer bestimmten Datei zu erkennen, definieren Sie beispielsweise deren Pfad und Namen C:\MyDir\MyFile.log.
Um die Daten eines Verzeichnisses zu erkennen, definieren Sie dessen Beispielpfad C:\MyDir\MyFile.log.
Um Dateien in einem Verzeichnis aufzulisten, definieren Sie den Pfad mit dem Beispielfilter C:\MyDir\*.log.
Found (BOOL) Aktiviert für eine Schleife, wenn auf Befehl Init o Next Eine Datei wurde gefunden.
Fault (BOOL) Wird für eine Schleife aktiviert, wenn ein Ausführungsfehler auftritt.
IsDir (BOOL) Aktiv, wenn der zurückgegebene Dateiname zu einem Unterverzeichnis gehört.
Size (UDINT) Dateigröße.
FTime (UDINT) Datum der letzten Änderung der Datei in Epochenzeit (UTC).
Name (@STRING) Dateiname einschließlich beliebiger Erweiterung

SysGetFileInfos FB-Image

Beispiele

Verwendung der Beispiele.

ST_SysGetFileInfos: Wenn Sie sich in Telnet mit dem angegebenen Port verbinden, wird die E-Endung der Dateien und Verzeichnisse zurückgegeben, die im Pfadsatz gefunden wurden.

ST_DeleteOldestFiles: Aktivierung der Variablen aus dem Debug Deletewerden die Dateien im definierten Verzeichnis überprüft und die ältesten gelöscht, um die Anzahl der Gesamtdateien gleich dem Wert von zu halten Threshold.

Weitere Beispiele finden Sie in der Funktion 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]
War dieser Artikel hilfreich?