ADVPL – Leitura e Escrita de Arquivos: FT_, fOpen, FWFileReader e FWFileWriter
Neste artigo vamos explorar diferentes formas de realizar leitura e escrita de arquivos em ADVPL. Antes de falar sobre as classes modernas FWFileReader e FWFileWriter, vale revisitar métodos tradicionais que utilizei durante anos para manipular arquivos de maneira eficiente.
Por muito tempo utilizei as funções FT_* para leitura e escrita de texto. Veja o exemplo abaixo:

Exemplo de leitura com FT_FUSE
FT_FUSE(cArquivo)
Do While !FT_FEOF()
cBuffer := FT_FREADLN()
FT_FSKIP()
Enddo
FT_FUSE()
Leitura usando fOpen (mais rápida)
nHdl := FOpen(cArquivo, FO_READWRITE)
cString := FRead(nHdl, cString, 1024)
FClose(nHdl)
Exemplo de escrita em arquivo
nHdl := FCreate(cArquivo)
FSeek(nHdl, 0, FS_END)
cTexto += CRLF
FWrite(nHdl, cTexto, Len(cTexto))
FClose(nHdl)
Em um projeto antigo, onde requeri desempenho elevado, criei uma classe de leitura otimizada baseada nas referências de Julio (siga0984) e BlackToTDN.
Na época, substituí o operador $(Contém) pela função At e utilizei StrTokarr2 para fazer o split das linhas. O desempenho foi excelente, mesmo processando milhões de registros.
Trecho otimizado de leitura
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, "")
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
Observações:
- Na época, StrTokarr2 era uma função relativamente nova.
- Eu precisava quebrar linhas enormes, entre 8.000 e 16.000 bytes, o que ultrapassava limites das funções tradicionais (1024 bytes), causando quebras indevidas.
Hoje: FWFileReader e FWFileWriter
Felizmente o ADVPL evoluiu e agora dispomos de duas classes modernas e muito eficientes: FWFileReader e FWFileWriter. Ambas oferecem excelente desempenho e simplicidade.
Leitura com FWFileReader
A classe funciona muito bem e retorna rapidamente grandes volumes de dados.
oFile := FWFileReader():New(cArquivo)
If !oFile:Open()
MsgStop("Problema ao abrir o arquivo: " + cArquivo, "Universo do Desenvolvedor")
Endif
aFileLines := oFile:getAllLines()
cFullRead := oFile:FullRead()
oFile:Close()
Escrita com FWFileWriter
No TDN alguns exemplos estão incompletos — especialmente porque não mencionam o method Create(). Veja o uso correto:
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
Se este conteúdo te ajudou, compartilhe com seus amigos e deixe seu comentário! 😎
Um abraço e até a próxima!