Ajude o site desativando o bloqueador de anúncio
Cabeçalho

ADVPL - Leitura e Escrita de arquivo. FWFileReader e FWFileWriter

Autor: Eurai Criado: 19/08/2021 Atualizado: 13/11/2025 ADVPL
Postagem

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:

advpl tlpp ft funcoes leitura arquivos

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!

ASSINE A NEWSLETTER

Cadastrando...

PIX uDesenv

PIX QR Code para depósito

Clique para doar

Parceiros

Tudo em ADVPL - Blog parceiro

Blog ADVPL