Ficheiros, Pastas… e agora File Handles!

Tradução automática de Deepl

Os comandos File and Folder, que apareceram em 4D v17 R5, permitem gerir pastas e ficheiros em disco de uma forma moderna e eficiente.

Quando se trata de escrever e ler, as funções setText e getText estão à sua disposição para ler ou escrever a totalidade do conteúdo. Mas o que fazer se quiser ler ou acrescentar uma ou mais linhas a um documento existente? Isto pode ser feito mais facilmente do que nunca utilizando os novos objectos “file handles” que aparecem no 4D v19 R7.

Continue a ler para mais detalhes!

HDI Utilizar as pegas de ficheiro

O que são os File handles?

Os File handles são objectos criados com base em objectos “File” e têm funções para aceder a qualquer parte dos documentos e, a partir daí, para ler ou escrever sequencialmente o seu conteúdo.

Mesmo que, no caso geral, se leia do princípio ao fim, é possível definir com precisão a posição da “cabeça de leitura”.

Da mesma forma, quando se pretende abrir um documento para escrever novas informações, geralmente é no final do documento que se pretende escrever. Pode-se posicionar a “cabeça de leitura” onde se quiser.

Mas não é tudo!

A característica principal e mais significativa do tratamento de ficheiros é que evitará abrir e fechar documentos que são uma operação que consome muito tempo. E a melhor maneira de pensar é fechar o ficheiro por programação, já não é obrigatório. Assim que o ficheiro tratado não for referenciado em qualquer parte do seu código, o ficheiro será fechado automaticamente! Esta é a razão pela qual, como veremos mais tarde, nenhuma função .close() é necessária!

Vamos mergulhar numa amostra rápida

O objectivo é adicionar linhas a um ficheiro de registo. Vamos criar uma classe chamada Logger e uma função chamada writeLine e ver como chamá-la!

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)

Uma vez criada esta classe, chamemos-lhe !

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 

Nesta altura, poderíamos fechar o ficheiro colocando o objecto $logger em NULL, mas não é obrigatório ! No fim deste código, o $logger (e o seu atributo .fh) será NULL, por isso o ficheiro será fechado!

Atributos e funções

Nova função de ficheiro:

A primeira função, open(), é uma nova função de File que permite criar o cabo. O cabo pode ser criado em modo de leitura, modo de escrita ou modo de anexação.

$handle:=$file.open("write")

Também pode utilizar um objecto como parâmetro se precisar de especificar o charset, os delimitadores de leitura ou de escrita.

$o:=New object()
$o.mode:="append"
$o.charset:="UTF-8"
$o.breakModeRead:=Document with CRLF
$o.breakModeWrite:=Document with CRLF
$handle:=$file.open($o)

Uma vez criado o cabo, mais atributos e funções estarão disponíveis:

Mais dois Atributos úteis do Manípulo

  • .offset é a compensação actual do fluxo de dados (posição dentro do documento)
    • Este atributo pode ser escrito. Utilize-o apenas se precisar de definir a posição de leitura ou escrita num local específico. Basta lembrar que os seus valores mudam automaticamente após uma operação de leitura ou de escrita.
  • .eof é falso desde que o fim do documento não seja alcançado.

 

O atributo .eof permite navegar num ficheiro de uma forma muito elegante

$fileHandle:=$file.open("read")  
While (Not($fileHandle.eof))  // eof = end of file
	$text:=$fileHandle.readLine() 
	//…	
End while 

manejar Funções

A classe de puxadores vem com muitas funções que permitem:

  • Ler e escrever texto
  • Leitura e escrita de linhas (com gestão automática de quebras de linha)
  • Obter e definir o tamanho de um documento
  • Ler e escrever Blobs!

Para onde ir a partir daqui?

Encontre mais detalhes sobre o centro de documentação. E sinta-se à vontade para nos contactar nos fóruns 4D; teremos todo o prazer em ajudar.

Roland Lannuzel
- Proprietário do produto & Especialista 4D - Depois de estudar electrónica, a Roland entrou nas TI industriais como desenvolvedor e consultor, construindo soluções para clientes com uma variedade de bases de dados e tecnologias. No final dos anos 80, apaixonou-se pela 4D e utilizou-a para escrever aplicações comerciais que incluem sistemas de contabilidade, facturação e correio electrónico. Juntando-se à empresa em 1997, as valiosas contribuições de Roland incluem a concepção de especificações, ferramentas de teste, demonstrações, bem como formação e palestras para a comunidade 4D em muitas conferências. Ele continua a moldar activamente o futuro da 4D, definindo novas características e ferramentas de desenvolvimento de bases de dados.