Nesse vídeo demonstraremos a utilização da classe FWFileWriter, que serve para criar um arquivo e inserir conteúdos nele.
Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function zExe218
Exemplo de função que realiza gravações em um arquivo
@type Function
@author Atilio
@since 20/02/2023
@see https://tdn.totvs.com/display/public/framework/FWFileWriter
@obs
**** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/
User Function zExe218()
Local aArea := FWGetArea()
Local cArquivo := "C:\spool\curso\log_produtos.txt"
Local oFWriter := Nil
Local cLinha := ""
//Se o arquivo existir, irá apagar
If File(cArquivo)
FErase(cArquivo)
EndIf
//Cria o arquivo de logs
oFWriter := FWFileWriter():New(cArquivo, .T.)
//Se não foi possível criar o arquivo, encerra o Protheus
If ! oFWriter:Create()
Final("Houve um erro ao criar o arquivo - " + oFWriter:Error():Message)
Else
//Inicia o texto com um log genérico
oFWriter:Write("Código do Usuário: " + RetCodUsr() + CRLF)
oFWriter:Write("Nome do Usuário: " + UsrRetName(RetCodUsr()) + CRLF)
oFWriter:Write("Função (FunName): " + FunName() + CRLF)
oFWriter:Write("Ambiente: " + GetEnvServer() + CRLF)
oFWriter:Write(CRLF)
oFWriter:Write("Log iniciado, data [" + dToC(Date()) + "] e hora [" + Time() + "]" + CRLF)
oFWriter:Write("--" + CRLF)
oFWriter:Write(CRLF)
//Abre a tabela de produtos e posiciona no topo
DbSelectArea("SB1")
SB1->(DbSetOrder(1))
SB1->(DbGoTop())
//Enquanto houver produtos
While ! SB1->(EoF())
//Monta o texto da linha
cLinha := "[" + Time() + "] "
cLinha += " Prod: " + SB1->B1_COD + ";"
cLinha += " Tipo: " + SB1->B1_TIPO + ";"
cLinha += " Desc: " + SB1->B1_DESC + ";"
//Insere no arquivo
oFWriter:Write(cLinha + CRLF)
SB1->(DbSkip())
EndDo
//Mostra um texto no fim do arquivo
oFWriter:Write(CRLF)
oFWriter:Write("--" + CRLF)
oFWriter:Write("Log encerrado, data [" + dToC(Date()) + "] e hora [" + Time() + "]")
//Encerra o arquivo
oFWriter:Close()
//Se não for via job/webservice, abre o arquivo
If ! IsBlind()
ShellExecute("OPEN", cArquivo, "", "C:\spool\curso\", 1)
EndIf
EndIf
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Muito obrigado por compartilhar seu conhecimento. Testei aqui e deu certo no meu projeto.
Bom dia Jose, tudo joia?
Nós que agradecemos pelo comentário.
Tenha uma ótima e abençoada quarta feira.
Um forte abraço.
Uma duvida. Vi que voce testou se o arquivo não foi criado e ai ele cai fora ou continua. Mas supondo que na minha rotina eu precisasse fechar o arquivo em um determinado momento, existe um jeito de reabri-lo, testando se ele existe, e ai abri-lo novamente para uma nova gravação ao final do mesmo arquivo?
Bom dia Mauricio, tudo joia?
Eu nunca precisei fazer, não sei se tem algum recurso nativo.
Mas uma ideia seria:
a. Você pode antes de acionar a FWFileWriter, testar se o arquivo existe
b. Se existir, ai você pode usar a FWFileReader, e dar um FullRead e jogar numa variável
c. Depois você pega e aciona a FWFileWriter para criar o arquivo, e joga o conteúdo dessa variável do passo b
d. Ai tente incrementar depois no fim do arquivo
Tenha um ótimo e abençoado fim de semana.
Um forte abraço.
Obrigado pela idéia…também não achei função especifica pra reabrir o arquivo.
Bom dia Mauricio, tudo joia?
Entendi. Se eu conseguir um tempo, vou tentar pesquisar também.
Ai se encontrar, eu monto um conteúdo sobre o assunto.
Tenha uma ótima e abençoada segunda feira.
Um forte abraço.