Página 1 de 2

Listar pastas e subpastas

Enviado: 06 Mar 2017 18:05
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

Listar pastas e subpastas

Enviado: 06 Mar 2017 18:18
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

Listar pastas e subpastas

Enviado: 06 Mar 2017 22:39
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+

Listar pastas e subpastas

Enviado: 06 Mar 2017 22:43
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

Listar pastas e subpastas

Enviado: 06 Mar 2017 23:02
por JoséQuintas

Código: Selecionar todos

 CASE Upper( Right( oFile[ F_NAME ], 4 ) ) == ".DBF"
         AAdd( acFiles, cPath + oFile[ F_NAME ] )
  ENDCASE

Listar pastas e subpastas

Enviado: 07 Mar 2017 00:17
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.

Listar pastas e subpastas

Enviado: 07 Mar 2017 08:23
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,

Listar pastas e subpastas

Enviado: 07 Mar 2017 20:52
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

Listar pastas e subpastas

Enviado: 07 Mar 2017 20:54
por Pablo César
Muito bom.

Obrigado por compartilhar amigo Toledo.

Listar pastas e subpastas

Enviado: 07 Mar 2017 21:32
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

Listar pastas e subpastas

Enviado: 08 Mar 2017 15:08
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

Listar pastas e subpastas

Enviado: 08 Mar 2017 17:48
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.

Listar pastas e subpastas

Enviado: 10 Out 2023 09:27
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


Listar pastas e subpastas

Enviado: 10 Out 2023 12:54
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.

Listar pastas e subpastas

Enviado: 10 Out 2023 14:46
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.