Los comandos Archivo y Carpeta, que aparecieron en 4D v17 R5, le permiten gestionar las carpetas y los archivos del disco de forma moderna y eficaz.
Cuando se trata de escribir y leer, las funciones setText y getText están a su disposición para leer o escribir todo el contenido. Pero, ¿qué hacer si quieres leer o añadir una o varias líneas a un documento existente? Esto puede hacerse más fácilmente que nunca utilizando los nuevos objetos «file handles» que aparecen en 4D v19 R7.
Siga leyendo para conocer los detalles.
HDI Usar manejadores de archivo
¿Qué son los File handles?
Los File handles son objetos creados a partir de los objetos «File» y tienen funciones para acceder a cualquier parte de los documentos y, a partir de ahí, leer o escribir su contenido de forma secuencial.
Aunque, en el caso general, leamos desde el principio hasta el final, es posible definir con precisión la posición de la «cabeza lectora».
Del mismo modo, cuando se quiere abrir un documento para escribir nueva información, generalmente se sitúa al final del documento que se quiere escribir. Puedes colocar la «cabeza de escritura» donde quieras.
Pero eso no es todo.
La característica principal y más significativa del manejador de archivos es que evitará abrir y cerrar documentos que son una operación que consume mucho tiempo. Y lo mejor es que ya no es obligatorio cerrar el archivo mediante programación. ¡Tan pronto como el archivo manejado no sea referenciado en ninguna parte de su código, el archivo será cerrado automáticamente! Esa es la razón por la que, como veremos más adelante, ¡no se necesita la función .close()!
Veamos un ejemplo rápido
El objetivo es añadir líneas a un archivo de registro. ¡Creemos una clase llamada Logger y una función llamada writeLine y veamos cómo llamarla !
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 vez creada esta clase, ¡llamémosla!
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
En este punto, podríamos cerrar el archivo estableciendo el objeto $logger a NULL, ¡pero no es obligatorio! Al final de este código, el objeto $logger (y su atributo .fh) será NULL, por lo que el archivo estará cerrado.
Atributos y funciones
Nuevo archivo Función:
La primera función, open(), es una nueva función de File que permite crear el handle. El handle puede ser creado en modo lectura, modo escritura o modo append.
$handle:=$file.open("write")
También puede utilizar un objeto como parámetro si necesita especificar el conjunto de caracteres, los delimitadores de lectura o escritura.
$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 vez creado el handle, habrá más atributos y funciones disponibles:
Dos atributos útiles más del Handle
- .offset es el desplazamiento actual del flujo de datos (posición dentro del documento)
- Este atributo es escribible. Utilízalo sólo si necesitas establecer la posición de lectura o escritura en un lugar específico. Recuerda que sus valores cambian automáticamente después de una operación de lectura o escritura.
- .eof es falso mientras no se llegue al final del documento.
El atributo .eof permite navegar por un archivo de una manera muy elegante
$fileHandle:=$file.open("read")
While (Not($fileHandle.eof)) // eof = end of file
$text:=$fileHandle.readLine()
//…
End while
Funciones de handle
La clase handle viene con muchas funciones que permiten
- Leer y escribir texto
- Leer yescribir líneas (con gestión automática de los saltos de línea)
- Obtener y establecer el tamaño de un documento
- Leer y escribir Blobs
¿A dónde ir a partir de aquí?
Encuentre más detalles en el centro de documentación. Y no dude en contactarnos en los foros de 4D; estaremos encantados de ayudarle.