Saltar al contenido principal
Versión: 20 R6

FileHandle

La clase FileHandle tiene funciones que permiten leer secuencialmente o añadir contenido a un objeto File abierto. Un manejador de archivo puede acceder a cualquier parte de un documento.

Los objetos de tipo File handle se crean con la función file.open().

Para leer o escribir un documento completo de una vez, puede considerar el uso de las funciones file.getText() y file.setText().

Gracias al refcounting estándar de objetos de 4D, un manejador de archivo se borra automáticamente cuando deja de estar referenciado y, por tanto, el objeto File solicitado se cierra automáticamente. Por lo tanto, con los gestores de archivos no hay que preocuparse por el cierre de los documentos.

nota

Los recursos de los objetos, como los documentos, se liberan cuando ya no existen referencias en la memoria, lo que ocurre, por ejemplo, al final de la ejecución del método para las variables locales. Si desea "forzar" la liberación de los recursos del objeto en cualquier momento, puede anular sus referencias.

Ejemplo

var $f : 4D.File
var $fhandle : 4D.FileHandle
$f:=Folder(Database folder).file("example.txt")

//Escribiendo línea a línea desde el principio
$fhandle:=$f.open("write")
$text:="Hello World"
For ($line; 1; 4)
$fhandle.writeLine($text+String($line))
End for

//Escribir línea a línea desde el final
$fhandle:=$f.open("append")
$text:="Hello World"
For ($line; 1; 4)
$fhandle.writeLine($text+String($line))
End for

//Lectura utilizando un carácter de parada y un parámetro objeto
$o:=New object()
$o.mode:="read"
$o.charset:="UTF-8"
$o.breakModeRead:=Document with CRLF
$stopChar:="!"
$fhandle:=$f.open($o)
$text:=$fhandle.readText($stopChar)

//Lectura línea a línea
$lines:=New collection
$fhandle:=$f.open("read")
While (Not($fhandle.eof))
$lines.push($fhandle.readLine())
End while

Objeto FileHandle

Los objetos manejadores de archivos no pueden ser compartidos.

.breakModeRead : Text
el modo de procesamiento de los saltos de línea utilizado al leer el archivo
.breakModeWrite : Text
el modo de procesamiento de los saltos de línea utilizado al escribir en el archivo
.charset : Text
el conjunto de caracteres utilizado al leer o escribir en el archivo
.eof : Boolean
True si el offset ha llegado al final del archivo, y False en caso contrario
.file : 4D.File
el objeto 4D.File sobre el que se ha creado el manejador
.getSize() : Real
devuelve el tamaño actual del documento, expresado en bytes
.mode : Text
el modo en que se creó el manejador de fichero: "read", "write", o "append"
.offset : Real
el desplazamiento actual del flujo de datos (posición dentro del documento)
[.readBlob( bytes : Real ) : 4D.Blob ](#readblob)
devuelve un blob de un tamaño de bytes del archivo, empezando por la posición actual
.readLine() : Text
devuelve una línea de texto desde la posición actual hasta que se encuentra un delimitador de fin de línea o se alcanza el final del documento
.readText( { stopChar : Text } ) : Text
devuelve el texto del archivo, comenzando desde la posición actual hasta que se encuentre la primera cadena stopChar (si se ha pasado) o se llegue al final del archivo
.setSize( size : Real )
define un nuevo tamaño de size en bytes para el documento
.writeBlob( blob : 4D.Blob )
escribe blob en el archivo, comenzando desde la posición actual
.writeLine( lineOfText : Text )
escribe contenido lineOfText en la posición actual e inserta un delimitador de fin de línea
.writeText( textToWrite : Text )
escribe el contenido de textToWrite en la posición actual y no inserta un delimitador de fin de línea

.breakModeRead

Historia
LanzamientoModificaciones
19 R7Añadidos

.breakModeRead : Text

Descripción

La propiedad .breakModeRead devuelve el modo de procesamiento de los saltos de línea utilizado al leer el archivo.

La propiedad .breakModeRead se puede definir en la creación del handle con la función file.open() (ver la función .open() para más información). Por defecto es "native".

La propiedad .breakModeRead siempre contiene un valor de texto, incluso si la opción .open() fue definida utilizando un número (constante).

Esta propiedad es de solo lectura.

.breakModeWrite

Historia
LanzamientoModificaciones
19 R7Añadidos

.breakModeWrite : Text

Descripción

La propiedad .breakModeWrite devuelve el modo de procesamiento de los saltos de línea utilizado al escribir en el archivo.

La propiedad .breakModeWrite se puede definir en la creación del handle con la función file.open() (ver la función .open() para más información). Por defecto es "native".

La propiedad .breakModeWrite siempre contiene un valor texto, incluso si la opción .open() fue definida utilizando un número (constante).

Esta propiedad es de solo lectura.

.charset

Historia
LanzamientoModificaciones
19 R7Añadidos

.charset : Text

Descripción

La propiedad .charset devuelve el conjunto de caracteres utilizado al leer o escribir en el archivo.

El conjunto de caracteres puede definirse en la creación del manejador con la función file.open(). Por defecto es "UTF-8".

Esta propiedad es de solo lectura.

.eof

Historia
LanzamientoModificaciones
19 R7Añadidos

.eof : Boolean

Descripción

La propiedad .eof devuelve True si el offset ha llegado al final del archivo, y False en caso contrario.

Esta propiedad es de solo lectura.

.file

.file : 4D.File

Descripción

La propiedad .file devuelve el objeto 4D.File sobre el que se ha creado el manejador.

Esta propiedad es de solo lectura.

.getSize()

Historia
LanzamientoModificaciones
19 R7Añadidos

.getSize() : Real

ParámetrosTipoDescripción
ResultReal<-Tamaño del documento en bytes

Descripción

La función .getSize() devuelve el tamaño actual del documento, expresado en bytes.

Esta función devuelve el mismo valor que la propiedad (.size) de la clase File.

Ver también

.setSize(), file.size

.mode

Historia
LanzamientoModificaciones
19 R7Añadidos

.mode : Text

Descripción

La propiedad .mode devuelve el modo en que se creó el manejador de fichero: "read", "write", o "append".

El modo puede definirse en la creación del manejador con la función file.open(). Por defecto es "leer".

Esta propiedad es de solo lectura.

.offset

Historia
LanzamientoModificaciones
19 R7Añadidos

.offset : Real

Descripción

La propiedad .offset devuelve el desplazamiento actual del flujo de datos (posición dentro del documento). El valor del desplazamiento se actualiza automáticamente después de las operaciones de lectura y escritura.

Definiendo el .offset cambiará su valor actual en el momento de la siguiente operación de lectura o escritura.

  • Si el valor pasado es negativo, el .offset se define al inicio del archivo (cero).
  • Si el valor pasado es mayor que el tamaño del archivo, el .offset se define al final del archivo (tamaño del archivo).

Esta propiedad es lectura-escritura.

caution

Cuando se crea un file handle, el valor .offset es un número de bytes. Sin embargo, la unidad de medida del offset difiere según la función de lectura: con readBlob(), .offset es un número de bytes, mientras que con readText()/readLine() es un número de caracteres. Según el conjunto de caracteres del archivo, un caracter corresponde a uno o varios bytes. Por lo tanto, si comienza a leer con readBlob() y luego llama a readText(), la lectura de texto comenzará en una posición inconsistente. Por lo tanto, es esencial que establezca usted mismo la propiedad .offset si pasa de leer/escribir blob a leer/escribir texto en el mismo filehandle. Por ejemplo:

  // Abrir un fichero de texto europeo con codificación utf-16 (dos bytes por caracter)
// Queremos leer los 10 primeros caracteres como bytes, y luego el resto como texto.
$fh:=File("/RESOURCES/sample_utf_16.txt").open()
// leer los 20 primeros bytes (es decir, 10 caracteres)
$b:=$fh.readBlob(20) // $fh.offset=20
// luego lee todo el texto saltando los 10 primeros caracteres que acabamos de leer en el blob anterior
// como ahora estamos leyendo texto en lugar de bytes, el significado de 'offset' no es el mismo.
// Necesitamos traducirlo de bytes a caracteres.
$fh.offset:=10 // pedimos saltar 10 caracteres utf-16 (20 bytes)
$s:=$fh.readText()

.readBlob()

Historia
LanzamientoModificaciones
19 R7Añadidos

.readBlob( bytes : Real ) : 4D.Blob

ParámetrosTipoDescripción
bytesReal->Número de bytes a leer
Result4D.Blob<-Bytes leídos del archivo

Descripción

La función .readBlob() devuelve un blob de un tamaño de bytes del archivo, empezando por la posición actual .

Cuando se ejecuta esta función, la posición actual (.offset) se actualiza después del último byte leído.

Ver también

.writeBlob()

.readLine()

Historia
LanzamientoModificaciones
19 R7Añadidos

.readLine() : Text

ParámetrosTipoDescripción
ResultText<-Línea de texto

Descripción

La función .readLine() devuelve una línea de texto desde la posición actual hasta que se encuentra un delimitador de fin de línea o se alcanza el final del documento.

Cuando se ejecuta esta función, se actualiza la posición actual (.offset).

Atención

Esta función asume que la propiedad .offset es un número de caracteres, no un número de bytes. Para más información, consulte la descripción de.offset.

Cuando esta función se ejecuta por primera vez en un manejador de archivo, todo el contenido del documento se carga en un buffer.

Ver también

.readText(), .writeLine()

.readText()

Historia
LanzamientoModificaciones
19 R7Añadidos

.readText( { stopChar : Text } ) : Text

ParámetrosTipoDescripción
stopCharText->Caracter(es) en los que dejar de leer
ResultText<-Texto del archivo

Descripción

La función .readText() devuelve el texto del archivo, comenzando desde la posición actual hasta que se encuentre la primera cadena stopChar (si se ha pasado) o se llegue al final del archivo.

La cadena de caracteres stopChar no se incluye en el texto devuelto. Si se omite el parámetro stopChar, se devuelve todo el texto del documento.

Cuando se ejecuta esta función, (.offset) se coloca justo después de la cadena stopChar.

Atención

Esta función asume que la propiedad .offset es un número de caracteres, no un número de bytes. Para más información, consulte la descripción de.offset.

Si se pasa el parámetro stopChar y no se encuentra, .readText() devuelve una cadena vacía y el .offset se deja intacto.

Cuando esta función se ejecuta por primera vez en un manejador de archivo, todo el contenido del documento se carga en un buffer.

Ver también

.readLine(), .writeText()

.setSize()

Historia
LanzamientoModificaciones
19 R7Añadidos

.setSize( size : Real )

ParámetrosTipoDescripción
sizeReal->Nuevo tamaño del documento en bytes

Descripción

La función .setSize() define un nuevo tamaño de size en bytes para el documento.

Si el valor de size es menor que el tamaño actual del documento, el contenido del documento se trunca desde el principio para obtener el nuevo size.

Ver también

.getSize(), file.size

.writeBlob()

Historia
LanzamientoModificaciones
19 R7Añadidos

.writeBlob( blob : 4D.Blob )

ParámetrosTipoDescripción
blob4D.Blob->Blob a escribir en el archivo

Descripción

La función .writeBlob() escribe blob en el archivo, comenzando desde la posición actual .

Cuando se ejecuta esta función, la posición actual (.offset) se actualiza después del último byte escrito.

Ver también

.readBlob()

.writeLine()

Historia
LanzamientoModificaciones
19 R7Añadidos

.writeLine( lineOfText : Text )

ParámetrosTipoDescripción
lineOfTextText->Texto a escribir

Descripción

La función .writeLine() escribe contenido lineOfText en la posición actual e inserta un delimitador de fin de línea (a diferencia de la función .writeText()). Por defecto, se utiliza un delimitador nativo de fin de línea, pero puede definir otro delimitador cuando abra el manejador el file handle definiendo la propiedad .breakModeWrite.

Cuando se ejecuta esta función, la posición actual (.offset) se actualiza después del delimitador de fin de línea.

Ver también

.breakModeWrite, .readLine(), .writeText()

.writeText()

Historia
LanzamientoModificaciones
19 R7Añadidos

.writeText( textToWrite : Text )

ParámetrosTipoDescripción
textToWriteText->Texto a escribir

Descripción

La función .writeText() escribe el contenido de textToWrite en la posición actual y no inserta un delimitador de fin de línea (a diferencia de la función .writeLine()). Por defecto, se utiliza el delimitador nativo, pero puede definir otro delimitador cuando abra el file handle definiendo la propiedad .breakModeWrite.

Cuando se ejecuta esta función, la posición actual (.offset) se actualiza después del siguiente delimitador de fin de línea.

Ver también

.breakModeWrite, .readText(), .writeLine()