Ajude o site desativando o bloqueador de anúncio

ASSINE A NEWSLETTER

Cadastrando...
PIX uDesenv pix deposito

ADVPL - Leitura e Escrita de arquivo. FWFileReader e FWFileWriter

Autor: Eurai Criado: 19/08/2021 Atualizado: 18/11/2024

 

Neste artigo irei comentar sobre leituras e escritas em arquivos. Antes de comentar sobre as classes FWFileReader e FWFileWriter, irei escrever um pouco de como utilizar a escrita e leitura sem essas classes.

 

Durante bastante tempo utilizei as funções FT_ para leitura e escrita (Texto), vide abaixo:

advpl-tlpp-ft-funcoes-leitura-arquivos 

 

Exemplo:

FT_FUSE(cArquivo)
Do While !FT_FEOF()	
	cBuffer := FT_FREADLN()	
	FT_FSKIP()
Enddo
FT_FUSE()    

 

Em outros casos, utilizei o fOpen para leitura mais rápida. Exemplo:

nHdl := FOpen(cArquivo, FO_READWRITE)
cString := FRead( nHdl , cString, 1024 )
FClose(nHdl)

Para escrita já fiz muito uso do:

nHdl := FCreate(cArquivo)
FSeek(nHdl,0,FS_END)
cTexto += CRLF
FWrite(nHdl, cTexto, Len(cTexto))
FClose(nHdl) 

 

 

Um tempão atrás, onde precisei melhorar o desempenho, criei uma classe de leitura onde realizei melhorias baseado no conteúdo do Julio siga0984 e nesse link do BlackToTDN.

Realizei ajuste no $ (Contém) para a função At e utilizei a função StrTokarr2 para quebra com demilitador.  Desempenho foi maravilhoso para milhões de leitura, trecho:

 

	nHandle := fOpen( AllTrim(::cArquivo) )
	nFileSize := fSeek( nHandle , 0 , 2 )
	fSeek( nHandle , 0 , 0 )

	Do While ( nBytesRead <= nFileSize )
		cBuffer += fReadStr( @nHandle , @nBufferSize )
		nBytesRead += nBufferSize
		Do While ( nPos := AT( cCRLF , cBuffer ) ) > 0
			cLine := SubStr( cBuffer , 1 , nPos + nAtPlus )
			cBuffer := SubStr( cBuffer , Len( cLine ) + 1 )
			cLine := StrTran( cLine , cCRLF , "" )
			//cLine := StrTran( cLine , 
, cCRLF ) If lStrToKar2 aAdd( aRegistro, StrToKarr2( cLine, ::cDelimit, .T. ) ) Else aAdd( aRegistro, ::oUDLib:StrToKarr( cLine, ::cDelimit ) ) Endif cLine := "" EndDo EndDo If !Empty( cBuffer ) If lStrToKar2 aAdd( aRegistro, StrToKarr2( cBuffer, ::cDelimit, .T. ) ) Else aAdd( aRegistro, ::oUDLib:StrToKarr( cBuffer, ::cDelimit ) ) Endif cBuffer := "" Endif

OBS_01: Na época a função strtokarr2 era nova.

OBS_02: Nessa classe utilizei uma amarração de header do arquivo vs SX3 

Precisei criar, devido as funções terem limite de leitura de 1024bytes, e no desenvolvimento, cada linha do arquivo tinha por volta de 8000 bytes a 16000bytes, onde ocorria quebras e leituras totalmente zoadas.

No programa acima, eu lia toda a linha até encontrar o CRLF, e após encontrar, quebrava em array a linha pelo demilitador.

 

Agora o ADVPL disponibiliza duas classe para essas tarefas, a FWFileReader e FWFileWriter.

Para leitura, utilizei a FWFileReader e funcionou corretamente a leitura, o desempenho foi ótimo. Irei realizar mais testes com arquivos grandes e linhas maiores, trago os resultados.

Para escrita, utilizei a FWFileWriter e funcionou corretamente. Seguindo o exemplo do TDN, não funcionou, esta faltando explicação, abaixo irei deixar exemplo de uso correto. Não é mencionado o method Create.

 

FWFileReader 

oFile := FWFileReader():New(cArquivo)
If !oFile:Open()
   MsgStop( "Problema em abrir o arquivo: " + cArquivo, 'Universo do Desenvolvedor' )
Endif
aFileLines := oFile:getAllLines()
cFullRead := oFile:FullRead()
oFile:Close()

 

 

FWFileWriter 

	Local oWriter       := FWFileWriter():New( 'C:\Temp\EURAI_' + Dtos(Date()) + '_' + StrTran(Time(),':','') + '.TXT', .F.) as object
	If !oWriter:Create()
		MsgInfo('Erro ao criar o arquivo de escrita ' ,'Universo do Desenvolvedor')
		Return( Nil )
	Endif
	If !oWriter:Write('Universo do Desenvolvedor : ' + cCRLF )
		MsgInfo('Problema ao escrever','Universo do Desenvolvedor')
		Return( Nil )
	Endif
	oWriter:Close()
	

 

 

 

 

 

Referências:

 

 

 

Gostou? Compartilhe com seus amigos e deixe um comentário! 😎

Um abraço, e até a próxima