SysDirListing, directory listing

  1. Home
  2. Knowledge Base
  3. Manualistica
  4. Programmazione IEC 61131-3
  5. Gestione file system
  6. SysDirListing, directory listing

Questo blocco funzione esegue il listing di tutti i files contenuti in una directory, occorre passare il nome della directory di cui eseguire il listing in PathName. Attivando l'ingresso Init si inizializza la lista dei files e viene ritornato il primo file trovato. Ad ogni comando Next si esegue la ricerca di un nuovo file nella directory selezionata. Se file trovato l'uscita Found si attiva per un loop e ne viene ritornato il nome in FileName.

Terminato l'elenco di tutti i files presenti nella directory su comando Next non viene più attivata l'uscita Found e FileName è abblencato. L'uscita IsDir si attiva se il nome del file ritornato è quello di una sottodirectory.

Function block
CODESYS: Non disponibile
LogicLab: eLLabXUnified12Lib

Init (BOOL) Alla attivazione viene inizializzato l'indice dei files nella directory indicata e viene ritornato il nome del primo file trovato.

Next (BOOL) Alla attivazione viene ritornato il nome del file puntato dall'indice nella directory indicata. L'indice si incrementa puntando il successivo file.

PathName (STRING[32]) Definizione directory di cui eseguire il listing. E' possibile definire anche eventuale filtro di ricerca (Esempio Storage\*.log).

Found (BOOL) Si attiva per un loop se su comando Init o Next è stato trovato un nuovo file da listare.

IsDir (BOOL) Attiva se il nome di file ritornato appartiene ad una sottodirectory.

Size (UDINT) Si attiva per un loop se errore esecuzione.

Time (UDINT) Data ultima modifica del file in Epoch time (UTC).

FileName (STRING[16]) Nome del file comprensivo di eventuale estensione.

Errori

In caso di errore la funzione ritorna EOF, eseguendo immediatamente dopo la funzione SysGetLastError è possibile rilevare il codice di errore. Fare riferimento alla tabella seguente per la descrizione.

Esempi

Come utilizzare gli esempi.

ST_SysDirListing: Ad ogni attivazione da debug della variabile RLine, viene letta una riga dal file C:/System/Logs.txt che contiene i logs di sistema e la riga letta viene trasferita nella variabile LString che è visualizzabile in debug.

ST_DeleteOldestFiles: Attivando da debug la variabile Delete, vengono controllati i files presenti nella directory definita e sono cancellati quelli più vecchi per mantenere il numero di files totali pari al valore di Threshold.

Atri esempi si trovano nella funzione Sysremove.

LogicLab (Ptp116)
PROGRAM ST_SysDirListing
VAR
    i : INT; (* Auxiliary variable *)
    FFound : USINT; (* Files found *)
    DFound : USINT; (* Directories found *)
    CaseNr : USINT; (* Program case *)
    Fp : FILEP; (* File pointer array *)
    DList : SysDirListing; (* Directory listing *)
    EData : SysETimeToDate; (* Epoch to Date/Time *)
    TCPServer : SysTCPServer; (* TCP server *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysDirListing"
// *****************************************************************************
// When a telnet client connect to port 1200 it's executed the listing of
// "System" 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:=0; //Life time (S)
        TCPServer.RxSize:=128; //Rx buffer size
        TCPServer.TxSize:=128; //Tx buffer size

        // Directory listing initialization.

        DList.PathName:='/tmp/'; //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:=SysVarfprintf(Fp, '%s$r$n$r$n', 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.

            EData(EpochTime:=DList.Time); //Epoch time to Date/Time

            i:=SysVarfprintf(Fp, '%02d/', USINT_TYPE, ADR(EData.Day));
            i:=SysVarfprintf(Fp, '%02d/', USINT_TYPE, ADR(EData.Month));
            i:=SysVarfprintf(Fp, '%04d', UINT_TYPE, ADR(EData.Year));

            i:=SysVarfprintf(Fp, ' %02d:', USINT_TYPE, ADR(EData.Hour));
            i:=SysVarfprintf(Fp, '%02d', USINT_TYPE, ADR(EData.Minute));

            // Returns directory label or file length.

            IF (DList.IsDir) THEN
                DFound:=DFound+1; //Directories found
                i:=SysVarfprintf(Fp, ' %10s', STRING_TYPE, ADR('[DIR]'));
            ELSE
                FFound:=FFound+1; //Files found
                i:=SysVarfprintf(Fp, ' %10d', UDINT_TYPE, ADR(DList.Size));
            END_IF;

            // Returns file name.

            i:=SysVarfprintf(Fp, ' %s$r$n', STRING_TYPE, ADR(DList.FileName));
            CaseNr:=20; //Program case
            RETURN;        
        END_IF;

        // All files in the directory have been listed.        

        i:=SysVarfprintf(Fp, '%16d Files$r$n', USINT_TYPE, ADR(FFound));
        i:=SysVarfprintf(Fp, '%16d Directory$r$n', USINT_TYPE, ADR(DFound));
        CaseNr:=30; //Program case

        // ---------------------------------------------------------------------
        // Wait until the output buffer is empty.

        20, 30:
        IF (TO_UDINT(SysGetOSpace(Fp)) <> SysFGetOBfSize(Fp)) THEN RETURN; END_IF;
        IF (CaseNr = 30) THEN TCPServer.Enable:=FALSE; END_IF;
        CaseNr:=1; //Program case        
    END_CASE;

// [End of file]
LogicLab (Ptp116)

Ti è stato utile questo articolo ?

Ultimo aggiornamento: 17 Febbraio 2020