Nesse vídeo demonstraremos a utilização da classe FWFileReader, que serve para abrir e realizar a leitura de um arquivo.
Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function zExe217
Exemplo de função que realiza leituras de um arquivo
@type Function
@author Atilio
@since 20/02/2023
@see https://tdn.totvs.com/display/public/framework/FWFileReader
@obs
**** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/
User Function zExe217()
Local aArea := FWGetArea()
Local cArquivo := "C:\spool\curso\exemplo_query.sql"
Local cConteudo := ""
Local oFile
/*
Exemplo 1 - Fazendo a leitura do arquivo inteiro
*/
//Se o arquivo existir
If File(cArquivo)
//Tenta abrir o arquivo e pegar o conteudo
oFile := FwFileReader():New(cArquivo)
If oFile:Open()
//Se deu certo abrir o arquivo, pega o conteudo e exibe
cConteudo := oFile:FullRead()
ShowLog(cConteudo)
EndIf
oFile:Close()
EndIf
/*
Exemplo 2 - Fazendo a leitura do arquivo linha a linha
*/
//Se o arquivo existir
If File(cArquivo)
//Tenta abrir o arquivo e pegar o conteudo
oFile := FwFileReader():New(cArquivo)
If oFile:Open()
//Pegando o total de linhas
aLinhas := oFile:GetAllLines()
nTotLinhas := Len(aLinhas)
nLinhaAtu := 0
//Método GoTop não funciona (dependendo da versão da LIB), deve fechar e abrir novamente o arquivo
oFile:Close()
oFile := FWFileReader():New(cArquivo)
oFile:Open()
//Enquanto tiver linhas
While (oFile:HasLine())
nLinhaAtu++
//Pega a linha atual e exibe
cLinAtu := oFile:GetLine()
ShowLog("Linha '" + cValToChar(nLinhaAtu) + "': " + cLinAtu)
EndDo
EndIf
oFile:Close()
EndIf
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Muito bom! O vídeo foi bastante explicativo e fácil de entender.
Porém, surgiu uma dúvida: existe o FWFileReader para leitura de arquivos e o FWFileWriter para escrita. Mas, para editar um arquivo, há alguma classe como a FWFile ou é necessário usar as funções FT_?
Por exemplo, se eu criar o arquivo texto.txt, ao invés de apagar o conteúdo toda vez que a função for executada, seria possível concatenar o conteúdo?
Bom dia Kauan, tudo joia?
Sim, seria possível. A lógica seria mais ou menos a seguinte:
a. Se o arquivo já existir
b. Você pode ler o conteúdo do arquivo
c. E depois no final do arquivo você adiciona o texto
Ai para a lógica acima, você teria alguns cenários, dentre eles:
1. Não me lembro se na FWFileWriter, ela permite você abrir um arquivo e já popular o final dele, se sim, você pode tentar
2. Caso a FWFileWriter não permita você abrir o arquivo e já popular o final, leia o arquivo inteiro com a FWFileReader e depois incremente e grave com a FWFileWriter
3. Se o arquivo não passar de 64kb, você pode ler ele com a MemoRead, incrementar e depois usar a MemoWrite
Tenha uma ótima e abençoada quarta feira.
Um grande abraço.
Boa tarde, Daniel
Ótimo conteúdo!
Só me tira uma dúvida. Como trato essa classe para não ler linhas vazias (em branco)?
Bom dia Renato, tudo joia?
O que você poderia fazer, é logo após dar o GetLine, testar se ele tem conteúdo, algo mais ou menos assim:
//Pega a linha atual cLinAtu := oFile:GetLine() //Somente se tiver conteúdo na linha If ! Empty(cLinAtu) //Aqui você faz suas tratativas EndIfTenha uma ótima e abençoada quinta feira.
Um forte abraço.