SysFileRemove, file remove

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

Questa funzione da eseguire in task Back, esegue la rimozione (cancellazione) di un file. In Name occorre definire il nome del file da eliminare specificando l’intero percorso (Esempio C:\Directory\File.txt).

Se l’operazione di rimozione va a buon fine la funzione ritorna TRUE, in caso di errore viene ritornato FALSE.

Sostituisce Sysremove

Sostituisce la funzione Sysremove modificando il tipo di parametri in ingresso da stringa a puntatore a stringa. La precedente dichiarazione:

i:=Sysremove('C:\Directory\File.txt');

Diventa:

i:=SysFileRemove(ADR('C:\Directory\File.txt'));
Information Circle

Funzione

CODESYS: Non disponibile

LogicLab: eLLabXUnified12Lib

Descrizione

Name (@STRING]) Nome del file da cancellare compreso di percorso.

La funzione ritorna un (BOOL), FALSE se errore esecuzione, TRUE se esecuzione Ok.

Immagine F SysFileRemove

Esempi

Come utilizzare gli esempi.

ST_Sysremove: Attivando da debug la variabile Remove, il file C:DirectoryFile.txt se presente viene eliminato dal disco e la variabile viene resettata. In caso di errore di esecuzione il codice di errore è memorizzato nella variabile ECode.

ST_DeleteOldFiles: Attivando da debug la variabile LogOn, viene compialto un record di log con Data/Ora ed il testo definito nella variabile Text. Il record viene scritto nel file D:/Logs/Month, e sono cancellati dalla directory C:/Logs tutti i files precedenti mantenendo solo gli ultimi 6 mesi rispetto all’attuale.

ST_DeleteFilesByDate: Attivando da debug la variabile Delete, viene eseguita la scansione di tutti i files presente nel percorso definito e cancellati quelli più vecchi di 2 giorni.

LogicLab (Ptp116, ST_SysFileRemove)
PROGRAM ST_SysFileRemove
VAR
    Remove : BOOL; (* Remove command *)
    ECode : UDINT; (* Error code *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysFileRemove"
// *****************************************************************************
// By setting the Remove command a file is deleted.
// -----------------------------------------------------------------------------

    IF (Remove) THEN
        Remove:=FALSE; //Remove command

        // Checks if file is present on disk and deletes it.

        IF (SysGetFileLen(ADR('C:\Directory\File.txt')) <> eEOF) THEN
            IF NOT(SysFileRemove(ADR('C:\Directory\File.txt'))) THEN
                ECode:=SysGetLastError(TRUE); //Error code
            END_IF;
        END_IF;
    END_IF;

// [End of file]
LogicLab (Ptp116, ST_DeleteOldFiles)
PROGRAM ST_DeleteOldFiles
VAR
    LogOn : BOOL; (* Write log command *)
    i : UDINT; (* Auxiliary variable *)
    j : INT; (* Auxiliary variable *)
    LMonth : INT; (* Log mount *)
    Fp : eFILEP; (* File pointer *)
    Filename : STRING[ 32 ]; (* File name *)
    LRecord : STRING[ 64 ]; (* Log record *)
    Text : STRING[ 16 ]; (* Log text *)
    Months : ARRAY[0..11] OF @STRING; (* Month file names *)
    LDTS : LDATETIMESTRUCT; (* Long Date/Time struct *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_DeleteOldFiles"
// *****************************************************************************
// A simple data logger that stores a text record on a monthly file. At every
// new month only the 6 older months than the current one are kept in the
// defined directory.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATIONS
    // -------------------------------------------------------------------------
    // At first execution loop the month file names are defined.

    IF (SysFirstLoop) THEN
        Months[0]:=ADR('January'); 
        Months[1]:=ADR('February');
        Months[2]:=ADR('March');
        Months[3]:=ADR('April');
        Months[4]:=ADR('May');
        Months[5]:=ADR('June');
        Months[6]:=ADR('July');
        Months[7]:=ADR('August');
        Months[8]:=ADR('September');
        Months[9]:=ADR('October');
        Months[10]:=ADR('November');
        Months[11]:=ADR('December');
    END_IF;

    // -------------------------------------------------------------------------
    // CREATES LOG RECORD
    // -------------------------------------------------------------------------
    // If the "LogOn" is set by debug a new record is written in the log file.    

    IF NOT(LogOn) THEN RETURN; END_IF;
    LogOn:=FALSE; //Write log command
    Text:='This is a log'; //Log text
    
    // Creates the log record to be written.

    i:=DateTimeFormat(TO_LDATE_AND_TIME(SysDateGetNs()), ADR('^d/m/Y\ H\:i\:s'), ADR(LRecord), SIZEOF(LRecord));
    i:=SysCVsnprintf(ADR(LRecord), SIZEOF(LRecord), ADR(' %s$r$n'), STRING_TYPE, ADR(Text));

    // -------------------------------------------------------------------------
    // DELETES OLD FILES
    // -------------------------------------------------------------------------
    // Assign data values.

    i:=SPLIT_DT(TO_DATE_AND_TIME(SysDateGetS()), ADR(LDTS.Year), ADR(LDTS.Month), ADR(LDTS.Day), ADR(LDTS.Hours), ADR(LDTS.Minutes), ADR(LDTS.Seconds));

    // Checks if the month has been changed after last record write.

    IF (LDTS.Month <> LMonth) THEN
        LMonth:=LDTS.Month; //Log mount

        // Deletes the 6 months older than the current month.

        FOR j:=(LMonth+1) TO (LMonth+6) DO
            IF (j > 12) THEN i:=j-12; ELSE i:=j; END_IF;

            i:=SysVsnprintf(ADR(Filename), SIZEOF(Filename), ADR('D:/Logs/%s.txt'), STRING_TYPE, Months[i-1]);
            IF (SysGetFileLen(ADR(Filename)) <> eEOF) THEN i:=SysFileRemove(ADR(Filename)); END_IF;
            i:=SysWrSpyData(SPY_ASCII, 0, 16#00000001, ADR('Checked'), ADR(Filename));
        END_FOR;
    END_IF;

    // -------------------------------------------------------------------------
    // WRITE LOG FILE
    // -------------------------------------------------------------------------
    // Creates the log file name.

    i:=SysVsnprintf(ADR(Filename), SIZEOF(Filename), ADR('D:/Logs/%s.txt'), STRING_TYPE, Months[LMonth-1]);
    Fp:=SysFfopen(ADR(Filename), ADR('a')); //File pointer

    IF (SysFIsOpen(Fp)) THEN
        i:=Sysfwrite(ADR(LRecord), TO_INT(Sysstrlen(ADR(LRecord))), 1, Fp);
        i:=Sysfclose(Fp);
    END_IF;

// [End of file]
LogicLab (Ptp116, ST_DeleteFilesByDate)
PROGRAM ST_DeleteFilesByDate
VAR
    i : UDINT; (* Auxiliary variable *)
    Delete : BOOL; (* Delete files command *)
    CaseNr : USINT; (* Program case *)
    FFound : USINT; (* Files found *)
    DList : SysGetFileInfos; (* Directory listing *)
    FDeleted : USINT; (* Files deleted *)
    FRemove : STRING[ 64 ]; (* File to remove *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_DeleteFilesByDate"
// *****************************************************************************
// Setting by debug the "Delete" variable, are deleted from the defined path all
// files older than 2 days.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // DIRECTORY LISTING MANAGEMENT
    // -------------------------------------------------------------------------
    // Manage the directory listing.

    DList.PathName:=ADR('MyDir'); //Directory to list
    DList(); //Directory listing
    DList.Init:=FALSE; //Init listing
    DList.Next:=FALSE; //Next command

    // -------------------------------------------------------------------------
    // PROGRAM CASES
    // -------------------------------------------------------------------------
    // Program case management.

    CASE (CaseNr) OF

        // ---------------------------------------------------------------------
        // Wait for delete command ad init listing.

        0:
        IF NOT(Delete) THEN RETURN; END_IF;
        Delete:=FALSE; //Delete files command
        FFound:=0; //Files found
        FDeleted:=0; //Files deleted
        DList.Init:=TRUE; //Init listing
        CaseNr:=CaseNr+1; //Program case

        // ---------------------------------------------------------------------
        // If file found returns file data.

        1:
        IF NOT(DList.Found) THEN CaseNr:=0; RETURN; END_IF;
        FFound:=FFound+1; //Files found

        // Check if file date is older than 2 days (172800 seconds).

        IF (DList.FTime > (SysDateTime-172800)) THEN RETURN; END_IF;

        // Delete the file from disk.

        i:=SysVsnprintf(ADR(FRemove), SIZEOF(FRemove), ADR('%s/'), STRING_TYPE, ADR(DList.PathName));
        i:=SysCVsnprintf(ADR(FRemove), SIZEOF(FRemove), ADR('%s'), STRING_TYPE, ADR(DList.Name));
        i:=SysFileRemove(ADR(FRemove)); //Delete file
        FDeleted:=FDeleted+1; //Files deleted
        DList.Next:=TRUE; //Next command
    END_CASE;

// [End of file]
Was this article helpful?