Como percorrer vários pastas e subpastas via AdvPL com Batch no Windows | Ti Responde 0132

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação