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:
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