I comandi File e Cartella, apparsi in 4D v17 R5, consentono di gestire cartelle e file su disco in modo moderno ed efficiente.
Per quanto riguarda la scrittura e la lettura, le funzioni setText e getText sono a disposizione per leggere o scrivere l’intero contenuto. Ma cosa fare se si desidera leggere o aggiungere una o più righe a un documento esistente? Questo può essere fatto in modo più semplice che mai utilizzando i nuovi oggetti “file handle” che compaiono in 4D v19 R7.
Continuate a leggere per i dettagli!
HDI Utilizzare le maniglie dei file
Cosa sono le maniglie dei file?
I file handle sono oggetti creati sulla base degli oggetti “File” e dispongono di funzioni per accedere a qualsiasi parte dei documenti e, da lì, leggere o scrivere il loro contenuto in modo sequenziale.
Anche se, nel caso generale, si legge dall’inizio alla fine, è possibile definire con precisione la posizione della “testa di lettura”.
Allo stesso modo, quando si vuole aprire un documento per scrivere nuove informazioni, ci si trova generalmente alla fine del documento che si vuole scrivere. È possibile posizionare la “testa di scrittura” dove si vuole.
Ma non è tutto!
La caratteristica principale e più significativa della gestione dei file è che evita di aprire e chiudere i documenti, operazione che richiede molto tempo. E la cosa migliore è che la chiusura del file da parte della programmazione non è più obbligatoria. Non appena il file gestito non viene più citato da nessuna parte nel codice, il file viene chiuso automaticamente! Ecco perché, come vedremo più avanti, non è necessaria la funzione .close()!
Vediamo un rapido esempio
L’obiettivo è aggiungere righe a un file di log. Creiamo una classe chiamata Logger e una funzione chiamata writeLine e vediamo come chiamarla!
Class constructor($logName : Text)
var $file : 4D.File
$file:=File("/LOGS/"+$logName)
$file.parent.create() // check that parent folder exists; Otherwise it will be created.
This.fh:=$file.open("append")
Function writeLine($logText : Text)
This.fh.writeLine($logText)
Una volta creata questa classe, chiamiamola!
var $logger : cs.Logger
var $logName : Text
$logName:=Replace string(Timestamp; ":"; "-")+".txt"
$logger:=cs.Logger.new($logName)
For ($i; 1; 10)
$logger.writeLine("test_"+String(Random))
End for
A questo punto, potremmo chiudere il file impostando l’oggetto $logger a NULL, ma non è obbligatorio! Alla fine di questo codice, $logger (e il suo attributo .fh) sarà NULL e il file sarà chiuso!
Attributi e funzioni
Nuovo file Funzione:
La prima funzione, open(), è una nuova funzione di File che consente di creare l’handle. L’handle può essere creato in modalità lettura, scrittura o append.
$handle:=$file.open("write")
Si può anche usare un oggetto come parametro, se è necessario specificare il set di caratteri, i delimitatori di lettura o di scrittura.
$o:=New object()
$o.mode:="append"
$o.charset:="UTF-8"
$o.breakModeRead:=Document with CRLF
$o.breakModeWrite:=Document with CRLF
$handle:=$file.open($o)
Una volta creato l’handle, saranno disponibili altri attributi e funzioni:
Altri due attributi utili per l’handle
- .offset è l’offset corrente del flusso di dati (posizione all’interno del documento)
- Questo attributo è scrivibile. Usatelo solo se avete bisogno di impostare la posizione di lettura o scrittura in un punto specifico. Ricordate che il suo valore cambia automaticamente dopo un’operazione di lettura o scrittura.
- .eof è falso finché non si raggiunge la fine del documento.
L’attributo .eof permette di sfogliare un file in modo molto elegante
$fileHandle:=$file.open("read")
While (Not($fileHandle.eof)) // eof = end of file
$text:=$fileHandle.readLine()
//…
End while
Funzioni di handle
La classe handle è dotata di numerose funzioni che consentono di:
- Leggere e scrivere testo
- leggere e scrivere righe (con gestione automatica delle interruzioni di riga)
- Ottenere e impostare la dimensione di un documento
- Leggere e scrivere blob!
Dove andare a parare?
Trovate maggiori dettagli nel centro di documentazione. E non esitate a contattarci sui forum 4D; saremo felici di aiutarvi.