Listar pastas e subpastas

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Listar pastas e subpastas

Mensagem por rubens »

Boa tarde...

Como faço para pegar a pasta e subpastas?

Pelo que vi no Directory() basta colocar a opção "D", mas só aparece uma lista, não dá para saber se é pasta ou arquivo.
Como estou fazendo

Código: Selecionar todos

PROCEDURE Main()
	cTexto := ''
	aDir1 := DIRECTORY("c:\hmg\", "D")  
	For x = 1 to Len( aDir1 )
		cTexto += aDir1[x,1] +Hb_Eol()
	Next
	MemoEdit( cTexto, 10,10,20,70 )
	Return nil		
Daí no memoedit aparece uma listagem com os nomes dos arquivos e pastas, mas quando é pasta não dá para saber como é pasta, dessa forma não sei como pegar os arquivos dentro das pastas...

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Listar pastas e subpastas

Mensagem por JoséQuintas »

Veja se ajuda.

Código: Selecionar todos

#include "directry.ch"

PROCEDURE Main

   LOCAL acFiles, cFileName

   SetMode(25,80)
   CLS
   acFiles := {}
   ListFiles( "C:\", acFiles )

   FOR EACH cFileName IN acFiles
      ? cFileName
   NEXT

   RETURN

FUNCTION ListFiles( cPath, acFiles )

   LOCAL oDirList, oFile

   oDirList := Directory( cPath + "*.*", "D" )
   FOR EACH oFile IN oDirList
      DO CASE
      CASE oFile[ F_NAME ] == "." .OR. oFile[ F_NAME ] == ".."
      CASE oFile[ F_ATTR ] == "D"
         ListFiles( cPath + oFile[ F_NAME ] + "\", acFiles )
      OTHERWISE
         AAdd( acFiles, cPath + oFile[ F_NAME ] )
      ENDCASE
   NEXT

   RETURN NIL
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Listar pastas e subpastas

Mensagem por rossine »

Olá Rubens,

Veja se este exemplo te ajuda:

Código: Selecionar todos

function main

local aDirec

cls

? "Listando os arquivos. Aguarde..."

aDirec := MyDirectoryRecurse( ".\*.prg", "A" )

hb_memowrit( "listdir.log", FormatDirStr( aDirec, .F. ) )

? "Veja o arquivo LISTDIR.LOG"

return NIL

***************************
function MyDirectoryRecurse( cMascara, cAtributo )
***************************

local cPath := "", cMask := "", cExt := "", aFiles := {}

hb_FNameSplit( cMascara, @cPath, @cMask, @cExt )

//busca da 1a pasta (find first folder)
aEval( Directory( cMascara, cAtributo ), { |x|
                                           if !x[1] == "OS"
                                              x[1] := cPath + x[1]
                                              aadd( aFiles, x )
                                           endif
                                         } )

//? "-------------"
//? "path=" + cPath  + "  cMask=" + cMask + "  cExt=" + cExt

//pega todos os arquivos e diretorios (find all files and folders)
aEval( Directory( cPath + hb_ps() + "*.*", "D" ), ;
       { |x| 
         local cNewPath
         if x[5] = "D" .and. !x[1] == "." .and. !x[1] == ".."
//            qout( "[" + cPath + "-" + x[1] + "-" + hb_ps() + cMascara + "]" )
            cNewPath := cPath + x[1] + hb_ps() + cMask + cExt // cMascara // cMask
//            ? cNewPath
            aEval( MyDirectoryRecurse( cNewPath, cAtributo ),{ |x| aadd( aFiles, x ) } )
         endif
       } )

return aFiles

*********************
function FormatDirStr( aDirec, lOrd ) // 30/11/16
*********************

local cDirec

__DefaultNIL( @lOrd, .F. )

if lOrd
   aDirec := asort( aDirec,,,{ |x,y| (dtos(x[3]) + x[4]) < (dtos(y[3]) + y[4]) } )
endif

cDirec := strtran( hb_valtoexp( aDirec ), "}, {", "}," + chr(13) + chr(10) + "{" )
cDirec := strtran( cDirec, ".\", "" )

return cDirec

T+
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Listar pastas e subpastas

Mensagem por rubens »

Quintas...
Blz... funcionou... sim...
Só um detalhe... se eu uso *.* lista as pastas...
Se uso uma máscara lista só os arquivos da pasta atual. Tipo *.dbf lista só da pasta atual das subpastas não lista...
O que precisa mudar para listar os dbf da pasta atual e das subpastas...?

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Listar pastas e subpastas

Mensagem por JoséQuintas »

Código: Selecionar todos

 CASE Upper( Right( oFile[ F_NAME ], 4 ) ) == ".DBF"
         AAdd( acFiles, cPath + oFile[ F_NAME ] )
  ENDCASE
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Listar pastas e subpastas

Mensagem por Claudio Soto »

Aquí hay un ejemplo en HMG oficial de como crear el árbol de directorios de un disco y como ir mostrando en un Grid los archivos de las diferentes carpetas.

http://pctoledo.com.br/forum/viewtopic.php?f=45&t=15418

PD: en los demos del control Tree de HMG oficial hay un ejemplo más sencillo de como escanear un disco y formar el árbol de directorios, pero este demo es mucho más lento que el ejemplo del link anterior, porque este último utiliza directo funciones en C de la lib Bos Taurus y no funciones de HB para escanear las carpetas y los archivos.
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Listar pastas e subpastas

Mensagem por Toledo »

rubens escreveu:para listar os dbf da pasta atual e das subpastas...?
Amigos, vejam também a função DirectoryRecurse() da xhb.lib:

Código: Selecionar todos

// The example collects file in formation about DBF files in the
// current directory and its sub-directories, and writes the result
// to a file.

   PROCEDURE Main
      LOCAL aFiles

      SET ALTERNATE TO PrgFiles.txt
      SET ALTERNATE ON

      aFiles := DirectoryRecurse( "*.dbf" )
      AEval( aFiles, {|a| QOut( ValToPrg( a ) ) } )

      SET ALTERNATE OFF
      SET ALTERNATE TO
   RETURN
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Listar pastas e subpastas

Mensagem por fladimir »

Um pequeno detalhe no exemplo do colega Quintas, faltou passar como referencia a variável Local acFiles para a função ListFiles()

Código: Selecionar todos

#include "directry.ch"

PROCEDURE Main

 LOCAL acFiles, cFileName

 SetMode(25,80)
 CLS
 acFiles := {}
 ListFiles( "C:\", @acFiles )  //---------------------> Passar com @ (referencia) devido variavel ser local

 FOR EACH cFileName IN acFiles
   ? cFileName
 NEXT

 RETURN
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Listar pastas e subpastas

Mensagem por Pablo César »

Muito bom.

Obrigado por compartilhar amigo Toledo.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Listar pastas e subpastas

Mensagem por JoséQuintas »

faltou passar como referencia a variável Local acFiles
Array é sempre passado por referência.
De qualquer forma, é bom lembrar desse detalhe.
Neste caso, por exemplo, já seria obrigatório passar por referência.

Código: Selecionar todos

LOCAL x
Rotina( @x )

FUNCTION Rotina( x )
   x := { 1 }
   RETURN NIL
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Listar pastas e subpastas

Mensagem por rubens »

Boa tarde...

Só para informar os testes...

A Solução do Rossine funcionou beleza...
Do Toledo com o DirectoryRecurse() da xhb.lib também funcionou inclusive vou adotar ela no sistema...
O Projeto do Dr. Claudio é muito bacana... só cheguei a ver... não estudei... é muito avançado para a necessidade do momento tendo em vista que surgiu uma solução mais simples...

Quintas mesmo colocando a sua última modificação, ainda não consegui listar as subpastas...
Retorna uma listagem como a da figura abaixo:
Erro_Mostra_dir.png
Não sei o que estou fazendo de errado... tentei debugar, acho que algo não está correto onde manda pegar todos os itens, mas é só especulação...

Obrigado a todos,

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Listar pastas e subpastas

Mensagem por JoséQuintas »

Simples: veja aonde colocou *.dbf, porque isso não tem no fonte que passei.... rs
Provavelmente passou o nome da pasta como *.dbf, e não deveria.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
deividdjs
Usuário Nível 3
Usuário Nível 3
Mensagens: 377
Registrado em: 19 Set 2006 09:39
Localização: Foz do Iguaçu / Pr

Listar pastas e subpastas

Mensagem por deividdjs »

Amigos .. bom dia!!

eu trabalho com Harbour e GTWVT ... eu consigo dentro da minha aplicação console chamar um explorador de arquivos do windows em modo janela ?? tipo para selecionar uma imagem ou um arquivos XML que será importado para dentro do sistema ... não sei se fui bem claro !! rs ... trabalhar meio q de forma hibrida ??? é possivel ?? pq tentei usar este codigo e não encontro essa função no harbour e pelo que pesquisei é do HMG.. como eu poderia conseguir essa façanha ? rs

de que biblioteca é essa função GETFILE () ??? alguem sabe ??

Código: Selecionar todos

*------------------------------*
  PROCEDURE IMPORT_XML_DBF()       
*------------------------------*
#include "directry.ch"

	/*
   LOCAL acFiles, cFileName

   acFiles := {}
   ListFiles( "\XML\", @acFiles )

   FOR EACH cFileName IN acFiles
      ? cFileName
   NEXT

   RETURN
	*/
	
         arquivo=getfile({{"Arquivo XML","*.xml"},"*.xml"},"Procurar arquivos XML","XML",.f.,.t.)
         xlocal="XML\"+right(arquivo,len(arquivo)-rat([\],arquivo))
         if left(xlocal,9)#"XML\"
            copy file &arquivo to &xlocal
         end if
         replace imagem with xlocal

Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Listar pastas e subpastas

Mensagem por Itamar M. Lins Jr. »

Olá!

Código: Selecionar todos

 cArqXML := win_GetOpenFileName(, "Arquivo XIS MÊ LÊ", "download\", "XML", "*.XML", 1 )
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Listar pastas e subpastas

Mensagem por JoséQuintas »

Como está usando essa rotina de pegar nomes de arquivos, é de se imaginar que está querendo adicionar algum algo mais no aplicativo.

Com WVG pode aproveitar sua tela console e brincar um pouco mais.
A princípio é compilar usando GTWVG.HBC.
O resto depende do que fizer.
Só importante lembrar que a rotina de erro padrão é pra console, e gtwvg não é console.
Anexos
icon.png
icon2.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder