SysGetFileInfos, get file infos

Home / Knowledge Base / Manualistica / Programmazione IEC 61131-3 / Gestione file system / SysGetFileInfos, get file infos

Questo blocco funzione ritorna le informazioni di singoli file o directory oppure dei file o directory contenuti in una directory. Passando in PathNane il nome del file o directory completo del percorso ed attivando Init, se il file o directory è presente ne sono ritornate le informazioni.

Eseguire listing di tutti i files in una cartella

Definendo in PathName il nome di una cartella seguito dal filtro "/*.*", attivando  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, se file trovato l'uscita Found si attiva per un loop e ne viene ritornato il nome in Name. Terminato l'elenco di tutti i files presenti su comando Next non viene più attivata l'uscita Found e Name è abblencato.

E' anche possibile eseguire un filtro sui files da tornare. Usando ad esempio "/*.htm" vengono tornati solo i file con estensione "htm".

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) Nome del file completo di percorso (Esempio C:\My.log). Per eseguire il listing dei files in una directory definirne il nome, è possibile definire anche un eventuale filtro di ricerca (Esempio C:\*.log).

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

Fault (BOOL) Si attiva per un loop se errore esecuzione.

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

Size (UDINT) Dimensione del file.

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

Name (@STRING) 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_SysGetFileInfos: Collegandosi in telnet alla porta indicata viene tornato l'elendo dei file e directory trovati nel percorso impostato..

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 TestDirList

VAR
    i : UDINT; (* Auxiliary variable *)
    Fp : eFILEP; (* File pointer array *)
    CaseNr : USINT; (* Program case *)
    FFound : USINT; (* Files found *)
    TCPServer : SysTCPServer; (* TCP server *)
    DList : SysGetFileInfos; (* Get file infos *)
    EData : SysETimeToDate; (* Epoch to Date/Time *)
    DFound : USINT; (* Directories found *)
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.

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

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

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

            // 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)

Ti è stato utile questo articolo ?