No vídeo de hoje, vamos demonstrar em como buscar todos os arquivos de uma pasta de forma recursiva usando AdvPL com um Batch do Windows.
A dúvida de hoje, nos perguntaram, se seria possível buscar todos os arquivos de uma determinada pasta, sem utilizar a zRecurDir ( https://terminaldeinformacao.com/2018/09/25/funcao-retorna-varios-arquivos-de-pastas-subpastas-em-advpl/ ).
Pensando nisso, montamos esse exemplo, onde criamos um batch em tempo de execução, que lista todos os arquivos dentro de um txt e depois lemos esse txt que foi gerado.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function zVid0132
Exemplo de como buscar vários arquivos de uma pasta usando um script do Windows
@type Function
@author Atilio
@since 23/02/2024
@obs Solução criada como alternativa a https://terminaldeinformacao.com/2018/09/25/funcao-retorna-varios-arquivos-de-pastas-subpastas-em-advpl/
Foi usado como referência o seguinte link: https://superuser.com/questions/1010287/how-to-recursively-list-files-and-only-files-in-windows-command-prompt
/*/
User Function zVid0132()
Local aArea := FWGetArea()
Local cPasta := FWInputBox("Informe o caminho (ex.: C:\pasta\):")
Local cDirTemp := GetTempPath()
Local cArqBatch := "gera_lista.bat"
Local cListaTmp := "lista_arq.txt"
Local cComando := ""
Local oFile
Local nLinhaAtu := 0
Local cNomeArq := ""
Local cLog := ""
//Se foi inserido o texto e a pasta existir no S.O.
If ! Empty(cPasta) .And. ExistDir(cPasta)
//Se o arquivo temporário já existir, apaga ele
If File(cDirTemp + cListaTmp)
FErase(cDirTemp + cListaTmp)
EndIf
//Se o batch já existir, apaga ele
If File(cDirTemp + cArqBatch)
FErase(cDirTemp + cArqBatch)
EndIf
//Aciona o comando para listar todos os arquivos, e gravar num arquivo temporário a lista
// Exemplo do comando completo:
// dir "C:\spool\" /A-D /S /B > "C:\Users\danat\AppData\Local\Temp\lista_arq.txt"
cComando := 'dir "' + cPasta + '" /A-D /S /B > "' + cDirTemp + cListaTmp + '"'
MemoWrite(cDirTemp + cArqBatch, cComando)
//Agora executa o bat para gerar o arquivo
ShellExecute("OPEN", cDirTemp + cArqBatch, "", cDirTemp, 0 )
//Se conseguiu gerar o arquivo temporário
If File(cDirTemp + cListaTmp)
//Tenta abrir o arquivo e pegar o conteudo
oFile := FwFileReader():New(cDirTemp + cListaTmp)
If oFile:Open()
//Enquanto tiver linhas
While (oFile:HasLine())
nLinhaAtu++
//Pega a linha atual e exibe
cNomeArq := oFile:GetLine()
cLog += "Arquivo '" + StrZero(nLinhaAtu, 10) + "': " + cNomeArq + CRLF
//Aqui se você quiser aproveitar, consegue utilizar a cNomeArq, ela vai ter o nome de cada arquivo, ai você
// pode fazer comandos, como por exemplo, File(cNomeArq), MemoRead(cNomeArq), etc
EndDo
//Exibe o log gerado
ShowLog(cLog)
EndIf
oFile:Close()
EndIf
Else
FWAlertError("Pasta inválida!", "Falha")
EndIf
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.